Genova810DokDomenemodell

Like dokumenter
Databaser: Relasjonsmodellen, del I

SQL Structured Query Language. Definere tabeller Skranker Fylle tabeller med data

Oppgaver Oppgave a: Sett opp mulige relasjoner

OptimalJ-kurs UIO Oppsummering av kurset. De ulike modellene egenskaper og formål

1. Relasjonsmodellen Kommentarer til læreboka

Fra krav til objektdesign

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Kapittel 9: Sortering og søking Kort versjon

Spesifikasjon av Lag emne. Kursregistrering bruksmønstermodell (ny versjon) Dagens forelesning. Fra krav til objektdesign

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

EKSAMEN DATABASER

INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

INF2220: Forelesning 3

1 Kodegenerering fra Tau Suiten

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Del 3: Evaluere uttrykk

IN1010 våren januar. Objektorientering i Java

Datamodellering og databaser SQL, del 2

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

Formål: I denne oppgaven skal du øve deg i å generere og endre GUI prototyper, samt lage database skjema på grunnlag av en UML modell.

INF1300 Introduksjon til databaser

HØGSKOLEN I SØR-TRØNDELAG

case forts. Generell interaktor Integer- interaktor Domenemodell Eksemplifisering av modellbasert tilnærming til design av brukergrensesnitt

AMS-case forts. Eksemplifisering av modellbasert. tilnærming til design av brukergrensesnitt

OPPGAVE 5b og 8b Java Kode

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Databaser & objektorientering.

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

INF1010 våren januar. Objektorientering i Java

Datamodellering og databaser SQL, del 2

IN2000. Gjennomgang av tekniske oppgaver på prøveeksamen. Erlend Stenlund og Steffen Almås + innspill fra Gaute Berge

Database security. Kapittel 14 Building Secure Software. Inf329, Høst 2005 Isabel Maldonado

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Spesifikasjon av Lag emne

Hvordan databasesystemene kan hjelpe RAM-produsentene

INF Algoritmer og datastrukturer

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

Utvikling med Genova. Agenda. Hvem er vi? Kursets struktur og forelesere. Modelldrevet utvikling av brukergrensesnitt og tjenester med Genova

Normalisering. Hva er normalisering?

Utvikling med Genova. Modelldrevet utvikling av brukergrensesnitt og tjenester med Genova

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Datamodellering og databaser SQL, del 2

Introduksjon til fagfeltet

Ansvarsdrevet OO: CRC og UML Sekvensdiagrammer

Kapittel 9: Sortering og søking Kort versjon

Gjennomgang av eksamen H99

EKSAMEN 6102 / 6102N DATABASER

Introduksjon til objektorientert programmering

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

Norges Informasjonsteknologiske Høgskole

Tilkobling og Triggere

>>12 Arbeide med MySQL

UNIVERSITETET I OSLO

INF1000: Forelesning 7

INF1000 Prøveeksamen Oppgave 7 og 9

Databasedesign HVA? HVORDAN? E/R diagram. Begrepsmessig databasedesign. Logisk databasedesign. Fysisk databasedesign

INF5120 Oblig 1c4 - Gruppe 19

Integritetsregler i SQL

ORDBMS og OODBMS i praksis

Eksamen i Internetteknologi Fagkode: ITE1526

Løsningsforslag til eksamen i INF1000 våren 2006

Normalisering. Hva er normalisering?

Metode for ansvarsdrevet OO. Dagens forelesning. Delegering av ansvar i en trelagsarkitektur

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

HØGSKOLEN I SØR-TRØNDELAG

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Satsvise, interaktive, sanntids/innbakte systemer. Arne Maus, Ifi. Oppdeling av både program og data på flere maskiner

Integritetsregler i SQL. Primærnøkler

EKSAMEN I FAG TDT MMI Lørdag 11. august 2012 Tid: kl

Arne Maus, Ifi. delvis lån av gamle foiler

Kapittel 9: Sortering og søking Kort versjon

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

Kapittel 9: Sortering og søking Kort versjon

OM DATABASER DATABASESYSTEMER

Implementering av caching ved hjelp av Spring. Christian Vestøl

INF1000: Forelesning 7. Konstruktører Static

Metaspråket for å beskrive grammatikk

Løsningsforslag Test 2

Prosjektoppgave: Bildedatabase. TDT4145 Datamodellering og Databasesystemer. Våren 2007

1. SQL datadefinisjon og manipulering

Dagens tema: Relasjonsmodellen (funksjonelle avhengigheter og nøkler, integritetsregler) Realisering: Fra ORM til relasjoner

Oppgave 1 (Opprett en database og en tabell)

Repetisjon: Normalformer og SQL

Obligatorisk oppgave 4: Lege/Resept

TDT4100 Objektorientert programmering

Beskjed fra Skagestein

Klasser og objekter. Tuva Kristine Thoresen 22. oktober Institutt for Informatikk

Introduksjon til databaseprogrammering med Java

Læringsmål for forelesningen

IN2090 Introduksjon til databaser

Eksamen Objektorientert Programmering 2011

Kapittel 7: Mer om arv

Semantisk Analyse del III

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Transkript:

Genova810DokDomenemodell Domenemodellering og JGrape Krav som stilles av persistensrammeverket Hibernate har følgende krav/anbefalinger til klassene i domenemodellen: 1. Persistente klasser skal ha en default-constructor. 2. Alle klasser bør ha en "id"-property. Dette kan være et enkelt attributt eller en sammensatt nøkkel, mer om dette senere. Det anbefales å bruke en ikke-primitiv type siden man da kan benytte "null" som et flagg for at forekomsten ennå ikke er lagret i basen. 3. Hvis det benyttes sammensatte nøkler uten egne nøkkel-klasser må domeneklassen imlementere equals/hashcode samt Serializable. 4. Klassene bør ikke være final, siden dette hindrer Hibernate i å opprette proxyklasser for "lazy loading". 5. Det anbefales å ha "JavaBeans style properties", dvs. med get/setmetoder for aksess. 6. Man bør implementere equals/hashcode for domeneklassene. Disse metodene bør baseres på verdier fra naturlige kandidatnøkler og ikke idattributt som tilordnes verdi ved første gangs lagring. 7. Hvis domeneobjekter skal kunne sendes til/fra en applikasjonsserver må klassene implementere Serializable. Valg av nøkkelstrategi Det er to hovedkategorier av nøkler: naturlige nøkler og surrogatnøkler. Naturlige nøkler har en mening innenfor domenet som klassen skal representere, mens surrogatnøkler er "dumme" identifikatorer som kun benyttes for å kunne skille mellom ulike forekomster av samme klasse. Mens det tidligere har vært vanlig å benytte naturlige nøkler som primærnøkler på databasetabeller er det nå mer vanlig å inkludere en egen id-kolonne for en surrogatnøkkel. Dette forenkler bla. håndtering av fremmednøkler, samt at man unngår situasjoner der attributter fra refererte objekter inngår som en del av nøkkelen. Hibernate anbefaler at man bruker naturlige nøkler kun i de tilfeller hvor man jobber mot eksisterende databaser ("legacy"-databaser).

Det er fullt mulig å lage en modell hvor noen klasser benytter naturlige nøkler mens andre har surrogatnøkler. NB! Primærnøkler bør være immutable! Surrogatnøkler Det er vanlig å benytte en heltalls-type for surrogatnøkkelkolonna, f.eks. en 32- bits integer. Siden nøkkelverdien ikke har noen forretningsmessig betydning er det vanlig å overlate generering av nøkkelverdi på nye forekomster til persistensrammeverket eller databasen, avhengig av hva som er støttet i databasen. Noen databasesystemer, f.eks. MySQL, Sybase og SQL Server, har støtte for en "identity"-type som tilordner unike nøkkelverdier ved "insert"- operasjoner. Andre, som f.eks. Oracle, har støtte for tilsvarende mekanismer med sin "sequence". Som kolonne-navn for surrogatnøkler er det vanlig å benytte "id" eller "<tabellnavn>_id", og en tilsvarende navning på attributtet i domeneklassen. Surrogatnøkler modelleres som f.eks. "int" eller "Integer" i UML-modellen. Valg av databasetype gjøres i databasemappingen. Naturlige nøkler Ved å bruke en naturlig nøkkel som primærnøkkel unngår man å bruke ekstra plass i databasetabellene og i Javaobjektene til å holde verdier som ikke har forretningsmessig mening. Typiske eksempler på naturlige nøkler kan være "ISBN-nummer", "navn", "kontonummer", "fødselsnummer" osv. Kravet er at det kun skal kunne finnes en forekomst med en gitt verdi at nøkkelen. Hvis dette ikke kan oppfylles for et enkelt attributt er det vanlig å lage sammensatte nøkler. Eksempel: klassen "OrdreLinje" kan ha en nøkkel som består av "ordrenummer" og "linjenummer", hvor de to verdiene til sammen alltid identifiserer en unik forekomst. Store modeller med sammensatte naturlig nøkler kan ofte bli kompliserte å jobbe med siden nøkkelelementer har en tendens til å bli "trukket ned" over mange nivåer. Eksempel: i en modell som innholder domeneklassene "Konsern", "Firma", "Avdeling" og "Team" kan det lett bli slik at "konsern_navn" inngår som nøkkelelement i alle de andre klassene, mens "firma_navn" inngår som nøkkelelement i "Avdeling" og "Team" osv. Hvis man velger å bruke sammensatte naturlige nøkler vil man pga. Hibernate måtte spesialhåndtere tilfeller der det finnes nøkkelelementer som er "trukket

ned" fra en assosiert klasse. Det vil f.eks. i eksempelet over ikke være mulig å hente opp forekomster av "Firma" uten at man har et sted å gjøre av "konsern_navn"-verdiene. Dette kan løses på ulike måter, Hibernate anbefaler at man oppretter egne klasser for de sammensatte nøklene. Dette er nærmere beskrevet i referansemanualen til Hibernate. Attributt-typer Verdier som ikke har egen identitet ("value objects") modelleres gjerne som attributter på domeneklassene. Datatyper som er støttet: Primitive typer samt deres wrappertyper String Date Numeric Subklasser av GenovaEnumerator + andre typer som man "mappes" til Genovas interne typer, se oppsett av "Type Mapping From Modeling Types" i Genovas setup-database. Optimistisk låsing For å sikre seg mot feilaktige oppdateringer i databasen i flerbrukersammenheng er det vanlig å benytte optimistisk låsing. Dette innebærer at hver rad i databasen har en versjonskolonne som endres for hver oppdatering som gjøres. Gitt at man tar med versjons-verdien som utvalgskriterium ved "update" sikrer man seg mot å oppdatere rader som i mellomtiden har blitt oppdatert av andre brukere. Dette håndteres automatisk av de fleste persistensrammeverk inklkudert Hibernate. Hvilken datatype som benyttes på versjonskolonna avhenger av hvilket databasesystem man bruker. Noen har innebygd støtte for dette som f.eks. "timestamp"-datatypen i Sybase og SQL Server, mens andre benytter en heltallsteller. Valg for optimistisk låsing gjøres i Genovas "Database Designer" (i setupdatabasen). Siden alle persistente objekter må ta vare på sin versjons-verdi gjøres dette enklest ved at domeneklassene arver fra rammeverksklassen PersistentClass.

Implementasjon av equals og hashcode Gode eksempler på implementasjon av disse finner man bl.a i "Effective Java". Hibernate anbefaler at man benytter naturlige nøkler for equals og hashcode. Eksempel: klassen Customer med en sammensatt nøkkel bestående av {custno, regdate, version}: )) public boolean equals(final Object other) { if ( other==null ) { return false; } if ( this==other ) { return true; } if (!( other instanceof Customer )) { return false; } final Customer that= (Customer) other; if ( this.getcustno()!= that.getcustno() ) final boolean b01= (this.getregdate()==null); final boolean b02= (that.getregdate()==null); if (b01!=b02) return false; if (!b01 &&!( this.getregdate().equals(that.getregdate()) if ( this.getdeklsekv()!= that.getdeklsekv() ) if ( this.getversion()!= that.getversion() ) return true; } public int hashcode() { int ii; int result=37; result= (31*result) + this.getclass().hashcode(); ii= getcustno();

} ii= (getregdate()==null)? 0 : getregdate().hashcode(); ii= getdeklsekv(); ii= getversion(); return result; Transiente domeneklasser Klasser for domeneobjekter som ikke skal lagres modelleres på sammen måte som andre domeneklasser, men de markeres som ikke persistente i modellen. De vil dermed ikke bli med i database mappingene i Genova, men er fullt tilgjengelige for bruk i objektseleksjoner og dialogmodeller. Transiente attributter Det finnes 2 ulike typer transiente attributter: Java-transiente og Genovatransiente. Java-transiente attributter markeres som "Transient=True" på "Java-fliken" i Rose. Dette medfører at attributtet genereres med modifikatoren "transient" i Javakoden, og dermed ikke tas med ved f.eks. serialisering. Genova-transiente attributter markeres som "Persistent=False" på "Genova DBfliken" i Rose. Dette medfører ingen endring i generert Javakode fra Rose, men attributtet tas ikke med som kolonne i databasemappingen for klassens tabell. Enumeratorer og grupper Modellering av enumeratorer og grupper er beskrevet i Genova User Guide, under kapittelet for Genova Rose Add-ins. Videre er bruk av enumerator-klasser beskrevet i dokumentasjonen for klientgeneratoren (for target Java/JFC).

UML pakkestruktur I Rose modelleres domeneklassene i "Logical View". I tillegg opprettes der en Java-komponent for hver klasse i "Component View". Hvilket view som benyttes som grunnlag for pakkestruktur i Genovas workspace er bestemt av en parameter i setup-databasen. Det anbefales å benytte "Component View" siden det er denne pakkestrukturen som benyttes av Rose ved generering av Javadomeneklassene.