Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA
Zbyněk Šlajchrt Část 6.
2
Perzistentní vrstva Prezentační vrstva "Jak aplikace vypadá"
Servlety JSP Filtry Business vrstva "Co aplikace dělá" Bezstavové EJB Beans Stavové EJB Beany Message Driven Beany Perzistentní vrstva "Co aplikace je" JPA Entity JMS Fronty JMS Topiky
3
Entita Perzistentní doménový objekt (PDO) Objekt Doménový Perzistentní
Atributy, metody, dědičnost, zapouzdření, identita ... Doménový Doménou rozumíme oblast, pro kterou je aplikace navržena Doménový objekt modeluje jsoucno z domény aplikace Faktura, objednávka, zboží, zákazník - z domény e-business Kniha, výpůjčka, čtenář, upomínka - z domény knihovnictví Perzistentní Modelované jsoucno má trvalý charakter Data jsou uložena v úložišti, které je schopné uchovávat data 'libovolně' dlouho
4
Entita v EJB3 (JPA) POJO (Plain Old Java Object)
Lze vytvářet pomocí new operátoru Testovatelné Atributy třídy entity představují sloupce v databázi vazby na jiné entity Operace (business logika) nad entitou by měly být vyjádřeny jako metody třídy entity Anti-vzor Anemic Entity (Fowler) - nedochůdče Nikoliv za každou cenu – pokud operace obnáší interakce mezi více entitami, lépe řešit např. session EJB
5
Entita - příklad
6
Kontext perzistence Ukládání a načítání stavu entity do/z databáze je možné pouze pokud se entita nachází v kontextu perzistence (Persistence Context) – připojená entita (attached) Mimo tento kontext je entita prostým objektem bez vazby na úložiště – odpojená entita (detached) V kontextu jsou sledovány změny stavu entity stav je synchronizován se stavem v db synchronizace může být vyvolána explicitně či implicitně má na starosti objekt EntityManager při uzavírání kontextu se všechny entity odpojí
7
kontext (Entity manager)
Kontext perzistence kontext.persist – založení nové entity v databázi kontext.merge – synchronizace odpojené entity se stavem v db Photo kontext (Entity manager) Photo kontext.detach – odpojení entity od kontextu Photo Photo DB kontext.find, kontext.getReference, JPA dotazy - vyhledávání
8
Transakční kontext perzistence
Doba života tohoto kontextu je pouze po dobu trvání transakce často v rámci volání jedné metody klientem V okamžiku ukončení transakce se uzavře i kontext všechny entity v kontextu se odpojí pouze pokud transakce proběhne v pořádku (commit), změny v entitách se synchronizují z databází Poznámka: platí pouze pro kontext řízený aplikačním serverem je možné vytvářet si vlastní kontext perzistence
9
Transakční kontext perzistence
EJB Volání business metody context.find(...) DB E1 Konec volání, předání výsledku E1
10
Rozšířený kontext perzistence
Doba života tohoto kontextu není svázána s trváním transakce v případě stavového EJB je doba života dána životem EJB Všechny entity v kontextu zůstávají připojeny i když je transakce ukončena Velmi užitečné v případech, kdy chceme provádět delší konverzace s databází a zároveň se vyhnout dlouhým transakcím dlouhé transakce blokují "vzácné" prostředky systému JDBC připojení, zámky
11
Rozšířený kontext perzistence
Stavový EJB Vytvoření instance stavového EJB Volání business metody context.find(...) DB E1 Konec volání, předání výsledku E1 Ukončení činnosti beanu
12
Rozšířený kontext - pseudokód
13
Životní cyklus entity Neexistuje Existuje v paměti Odpojená Připojená
instanciace garbage collector Existuje v paměti vyčištění na kontext volání detach(entita) serializace entity - volání persist na EM - výsledek dotazu odstranění z databáze odstranění Odpojená Připojená Odstraněná merge - obnova stavu (refresh) aktualizace stavu settery
14
Callback metody na entitách
Během životního cyklu entity dochází ke generování událostí Tyto události lze odchytávat přímo v entitě prostřednictvím tzv. callback metod Události vkládání (persisting) aktualizace (updating) mazání (deleting) výběr (selecting) Všechny události mají Pre a Post callback metody výjimkou je výběr, který má pouze Post callback
15
Životní cyklus a callback metody
Neexistuje metoda find, getReference nebo JPQL garbage collector Existuje v paměti @PostLoad @PrePersist @PostPersist, notifikace před a po uložení nové entity @PostRemove Uzavření kontextu, metoda detach @PreRemove Odpojená Připojená Odstraněná metoda merge @PostLoad, když se nahrává entita z DB před a po volání UPDATE na databázi. Tj. pouze pokud je entita pozměněná. @PreUpdate když jsou volány settery @PostLoad, když se provádí refresh
16
Callback metody - seznam
signatura: void nazevMetody() Anotace Popis označené metody @PrePersist Volá se před vlastním vytvořením záznamu v DB. @PostPersist Volá se po vytvoření záznamu entity v databázi. Primární klíč je vygenerován a nastaven do atributu entity. @PreUpdate Volá se před UPDATE operací. Důsledek volání setterů nebo EntityManager::merge. @PostUpdate Volá se po provedení operace UPDATE nad databází. @PreRemove Volá se před odstraněním záznamu entity z DB. @PostRemove Volá se po odstranění záznamu entity z databáze. @PostLoad Volá se po nahrání stavu z databáze do instance entity. Důsledek EntityManager::find, refresh a JPQL.
17
Posluchači entit Zpracování událostí v životním cyklu entit lze separovat do speciálních komponent – posluchačů Vhodné, když se logika v callback metodách přímo nedotýká entity Posluchač je POJO s metodami označenými anotacemi z tabulky na stránce 5 Signatura metody: void nazevMetody(Entita e) Posluchači se nasadí na třídu entity pomocí anotace @EntityListeners
18
Posluchač PhotoLogger
public class PhotoLogger { @PrePersist public void prePersist(Photo photo) { System.out.println("prePersist:" + photo); } @PostPersist public void postPersist(Photo photo) { System.out.println("postPersist:" + photo); @PreUpdate public void preUpdate(Photo photo) { System.out.println("preUpdate:" + photo); @PostUpdate public void postUpdate(Photo photo) { System.out.println("postUpdate:" + photo); @PreRemove public void preRemove(Photo photo) { System.out.println("preRemove:" + photo); @PostRemove public void postRemove(Photo photo) { System.out.println("postRemove:" + photo); @PostLoad public void postLoad(Photo photo) { System.out.println("postLoad:" + photo);
19
Konfigurace posluchače
Pomocí Alternativně v orm.xml. Vhodné pro ladění.
20
Generický posluchač entit
Není vázán na jediný typ entity Obdobné předchozímu typu posluchače Rozdíl v typu parametru callback metod java.lang.Object Lze registrovat jako tzv. default entity listener poslouchá na všech entitách možno pouze v orm.xml
21
Entita coby přenosový objekt (TO)
Odpojenou entitu lze použít jako přenosový objekt lze ji serializovat a poslat na klienta klient může provést úpravy a odeslat ji zpět na server na serveru se musí provést tzv. merge sloučení s verzí entity v kontextu (pokud v něm není, načte se) vzor Transfer (Value) Object V případě složitějších entit může být problematické přenášení celého grafu závislých entit může brzdit síť řešení: závislosti lze dohrávat dynamicky (lazy) nevýhoda – v různých situacích je na klientovi entita s různě připojenými závislými entitami (NullPointerException)
22
Jednotka perzistence Každá entita patří aspoň do jedné tzv. jednotky perzistence Lze definovat více jednotek perzistence Každá pracuje s právě jedním datovým zdrojem Entity lze přiřadit k jednotce explicitně či implicitně Implicitní zařazení entity JPA provider skenuje JAR soubor a zkoumá na třídách Explicitní Entity lze pro každou jednotku vyjmenovat v souboru META- INF/persistence.xml
23
Jednotka perzistence Unit 1 E2 DS1 E1 Unit 2 E2 DS2 E3
24
Soubor persistence.xml
Obsahuje konfigurace jednotek perzistence v modulu Modul může být obyčejný JAR nebo EJB-JAR Umístění v META-INF adresáři modulu JAR modul může být umístěn na classpath běžného Java SE programu WEB-INF/lib v kořenovém adresáři enterprise archivu (.ear) v lib adresáři enterprise archivu EJB-JAR se skenuje při umístění EAR na server
25
persistence.xml - příklad
Implicitní zařazení entit, tj. skenování JAR souboru Explicitní vyjmenování entit patřících do jednotky BankTest
26
Získání kontextu perzistence
Nejsnadněji pomocí injektáže Kontejner podává transakční perzistentní kontext Pro rozšířený kontext je třeba nastavit atribut type anotace na hodnotu EXTENDED Kontext lze získat také přes EntityManagerFactory
27
Poznámky k získávání kontextu
Doporučuje se používat injektáž vymyšleno pro zjednodušení práce nemusíme se starat o zavírání kontext nesmí se volat close() Pokud se použije EntityManagerFactory programátor musí dbát na uzavírání získaného kontextu voláním metody close() v prostředí Java SE se objekt továrny získá voláním statické metody createEntityManagerFactory na třídě javax.persistence.Persistence v Java EE injektáží do atributu anotovaného @PersistenceUnit
28
Práce s objektem EntityManager
Reprezentuje kontext perzistence Zprostředkovává tyto operace s entitami Ukládání Vyhledávání Aktualizace stavu Slučování Odstraňování Obnova stavu Uzamykání (v další přednášce)
29
Ukládání entit Vkládání stavu entity do databáze
Předpoklad, že entita doposud v databázi není Vytvoří se nový objekt entity Nastaví se její vlastnosti a relace Zavolá se metoda EntityManager::persist(entita) Po vložení se entita stává připojenou ke kontextu Pokud má entita relace s jinými entitami, může systém vytvořit jejich reprezentaci v databázi společně s hlavní entitou Kaskádová politika musí být PERSIST
30
Metoda persist Vyhazuje se EntityExistsException
v případě, že entita již existuje.
31
Ukládání entit Při volání persist může být vložení do db (SQL INSERT) odloženo Pokud dojde k ukládání v rámci transakce, vložení může být provedeno okamžitě, nebo na konci transakce ovládáno tzv. flush modem: setFlushMode(AUTO|COMMIT) Mimo transakci lze vkládat pouze pokud je kontext perzistence rozšířený Vlastní vložení je odloženo dokud se kontext nepřipojí k transakci EntityManager::joinTransaction() injektovaný rozšířený kontext se připojuje automaticky
32
Metoda persist - specifikace
Persisting an Entity Instance A new entity instance becomes both managed and persistent by invoking the persist method on it or by cascading the persist operation. The semantics of the persist operation, applied to an entity X are as follows: • If X is a new entity, it becomes managed. The entity X will be entered into the database at or before transaction commit or as a result of the flush operation. • If X is a preexisting managed entity, it is ignored by the persist operation. However, the persist operation is cascaded to entities referenced by X, if the relationships from X to these other entities is annotated with the cascade=PERSIST or cascade=ALL annotation element value or specified with the equivalent XML descriptor element.Entity Instance’s Life Cycle Enterprise JavaBeans 3.0, Final Release Entity Operations 49 5/2/06 Sun Microsystems, Inc. • If X is a removed entity, it becomes managed. • If X is a detached object, the EntityExistsException may be thrown when the persist operation is invoked, or the EntityExistsException or another PersistenceException may be thrown at flush or commit time. • For all entities Y referenced by a relationship from X, if the relationship to Y has been annotated with the cascade element value cascade=PERSIST or cascade=ALL, the persist operation is applied to Y.
33
Vyhledávání entit Dva způsoby
podle primárního klíče vytvořením a provedením dotazu Vyhledání podle primárního klíče – 2 metody <T> find(Class<T> entityClass, Objekt key) snaží se vyhledat entitu podle zadaného primárního klíče pro číselné typy funguje autoboxing inicializuje vlastnosti entity podle lazy-loading politiky <T> getReference(Class<T> entityClass, Objekt key) Vrací „lazy wrapper“ objekt entity T Pokud „obalená“ entita neexistuje, při prvním volání wraperu se vyhazuje EntityNotFoundException
34
Vyhledání entity dotazem
Vyhledání možné pomocí JPQL dotazu EntityManager nabízí tři typy metod pro vytváření dotazu createQuery sestrojí dotaz v syntaxi JPQL, který je předán jako parametr createNamedQuery sestrojí dotaz podle připraveného výrazu v orm.xml createNativeQuery sestrojí dotaz v nativní syntaxi SQL V EJB 3.1 (JPA 2) nový nástroj: Criteria API vhodné pro sestavování dotazů za běhu programu
35
Aktualizace entit V době, kdy je entita připojená ke kontextu, lze na ní provádět úpravy voláním setterů Operace, které vracejí připojené entity persist, find, getReference, vyhledání dotazem Ukládání do úložiště (SQL UPDATE) může být prováděno automaticky (v závislosti na flush-mode) Lze uložit explicitně voláním EntityManager::flush()
36
Slučování entit (merge)
Metoda EntityManager::merge(entita) Slučování odpojených entit s kontextem Pokud entita ještě není v kontextu, je vytvořena plná kopie, která se připojí ke kontextu. Pokud se již v kontextu nachází entita se stejným primárním klíčem, nahradí se její stav stavem odpojené entity (předávané jako argument) V obou případech metoda merge vrací připojenou entitu – předávaná entita se nepřipojuje ke kontextu!!! Je-li kontext rozšířený, lze volat merge i mimo transakci
37
Metoda merge
38
Metoda merge - specifikace
Merging Detached Entity State The merge operation allows for the propagation of state from detached entities onto persistent entities managed by the EntityManager. The semantics of the merge operation applied to an entity X are as follows: • If X is a detached entity, the state of X is copied onto a pre-existing managed entity instance X' of the same identity or a new managed copy X' of X is created. • If X is a new entity instance, a new managed entity instance X' is created and the state of X is copied into the new managed entity instance X'. • If X is a removed entity instance, an IllegalArgumentException will be thrown by the merge operation (or the transaction commit will fail). • If X is a managed entity, it is ignored by the merge operation, however, the merge operation is cascaded to entities referenced by relationships from X if these relationships have been annotated with the cascade element value cascade=MERGE or cascade=ALL annotation. • For all entities Y referenced by relationships from X having the cascade element value cascade=MERGE or cascade=ALL, Y is merged recursively as Y'. For all such Y referenced by X, X' is set to reference Y'. (Note that if X is managed then X is the same object as X'.) If X is an entity merged to X', with a reference to another entity Y, where cascade=MERGE or cascade=ALL is not specified, then navigation of the same association from X' yields a reference to a managed object Y' with the same persistent identity as Y. The persistence provider must not merge fields marked LAZY that have not been fetched: it must ignore such fields when merging. Any Version columns used by the entity must be checked by the persistence runtime implementation during the merge operation and/or at flush or commit time. In the absence of Version columns there is no additional version checking done by the persistence provider runtime during the merge operation
39
Metoda merge – specifikace (pokr.)
Merging Detached Entity State The merge operation allows for the propagation of state from detached entities onto persistent entities managed by the EntityManager. The semantics of the merge operation applied to an entity X are as follows: • If X is a detached entity, the state of X is copied onto a pre-existing managed entity instance X' of the same identity or a new managed copy X' of X is created. • If X is a new entity instance, a new managed entity instance X' is created and the state of X is copied into the new managed entity instance X'. • If X is a removed entity instance, an IllegalArgumentException will be thrown by the merge operation (or the transaction commit will fail). • If X is a managed entity, it is ignored by the merge operation, however, the merge operation is cascaded to entities referenced by relationships from X if these relationships have been annotated with the cascade element value cascade=MERGE or cascade=ALL annotation. • For all entities Y referenced by relationships from X having the cascade element value cascade=MERGE or cascade=ALL, Y is merged recursively as Y'. For all such Y referenced by X, X' is set to reference Y'. (Note that if X is managed then X is the same object as X'.) If X is an entity merged to X', with a reference to another entity Y, where cascade=MERGE or cascade=ALL is not specified, then navigation of the same association from X' yields a reference to a managed object Y' with the same persistent identity as Y. The persistence provider must not merge fields marked LAZY that have not been fetched: it must ignore such fields when merging. Any Version columns used by the entity must be checked by the persistence runtime implementation during the merge operation and/or at flush or commit time. In the absence of Version columns there is no additional version checking done by the persistence provider runtime during the merge operation
40
Odstraňování entit Metoda EntityManager::remove(entita)
Tato metoda nemusí okamžitě vyústit v odstranění entity z databáze (tj. SQL DELETE) chování se odvíjí od nastavení flush-mode Po volání remove je entita odpojena od kontextu Má-li entita nějaké relace, mohou být také odstraněny v závislosti na kaskádové politice Je-li kontext rozšířený, lze volat remove i mimo transakci
41
Odstraňování entit - specifikace
3.2.2 Removal A managed entity instance becomes removed by invoking the remove method on it or by cascading the remove operation. The semantics of the remove operation, applied to an entity X are as follows: • If X is a new entity, it is ignored by the remove operation. However, the remove operation is cascaded to entities referenced by X, if the relationship from X to these other entities is annotated with the cascade=REMOVE or cascade=ALL annotation element value. • If X is a managed entity, the remove operation causes it to become removed. The remove operation is cascaded to entities referenced by X, if the relationships from X to these other entities is annotated with the cascade=REMOVE or cascade=ALL annotation element value. • If X is a detached entity, an IllegalArgumentException will be thrown by the remove operation (or the transaction commit will fail). • If X is a removed entity, it is ignored by the remove operation. • A removed entity X will be removed from the database at or before transaction commit or as a result of the flush operation. After an entity has been removed, its state (except for generated state) will be that of the entity at the point at which the remove operation was called.
42
Obnova stavu entity Metoda EntityManager::refresh(entita)
V případě, že chceme obnovit stav entity nebo si nejsme jisti aktuálností stavu připojené entity, lze zavolat refresh(entita) Přepíše všechny provedené změny stavem z db Má-li entita nějaké relace, jejich stav může být také obnoven v závislosti na kaskádové politice Je-li kontext rozšířený, lze volat refresh i mimo transakci
43
Metody contains a clear
Metoda contains(entita) vrací true, pokud kontext perzistence obsahuje entitu předanou jako parametr Metoda clear() odpojí všechny entity momentálně připojené ke kontextu
44
Metoda flush Entity manager rozhoduje, kdy se změny způsobené voláním setterů, persist, merge a remove promítnou do databáze Synchronizaci lze prosadit voláním flush() Standardně se provádí automaticky před zpracováním dotazu, který souvisí se změnami v kontextu neúčinné implementace mohou provádět flush před každým dotazem výjimkou je find, jelikož hledání podle primárního klíč nemůže být ovlivněno změnami v kontextu
45
FlushModeType Chování entity manageru lze ohledně synchronizace s databází řídit použitím výčtového typu FlushModeType AUTO přednastavené chování, odpovídá popisu z předešlé stránky COMMIT změny jsou synchronizovány v okamžiku ukončení transakce (commit) synchronizace neprobíhá ani před dotazy používá se pro zvýšení výkonnosti (batch updates) Nastavuje se metodou setFlushMode(mode) na EM
46
Mapování perzistentních objektů
Párování tříd na tabulky, atributů entity na sloupce a relace v databázi, generování prim. klíčů atp. Obvykle dvě cesty Vytváříme schéma databáze podle objektového modelu Vytváříme objektový model podle existujícího databázového schéma JPA lze použít pro oba přístupy automatické generování databázového schéma automatické generování tříd entit ze schéma (nic moc) mapování pomocí anotací nebo xml
47
Základní mapovací prostředky
@Table Potřebujeme-li změnit defaultní mapování třídy entity na databázovou tabulku Anotace se umísťuje na třídu entity @Column Popisuje mapování atributů entity na sloupce tabulky Anotace se umisťuje na atribut třídy nebo na příslušný getter BigDecimal deposit;
48
Mapování primárních klíčů
Každá entita musí mít primární klíč PK mohou být mapovány na jednu či více vlastností primitivní typy, java.lang.String, složené s uvedených @Id identifikuje jednu či více vlastností entity @GeneratedValue(strategy) Doplněk říká, že hodnota PK se bude generovat TABLE – hodnota PK je udržována ve speciální tabulce SEQUENCE – hodnota PK je generována sekvencí IDENTITY – bude použit sloupec typu IDENTITY AUTO – volba je ponechána na poskytovatel JPA (default)
49
Generování PK přes tabulku
Programátorem definovaná tabulka, která v každé řádce udržuje hodnotu pro daný PK Dva sloupce PRIMARY_KEY_COLUMN – název primárního klíče VALUE_COLUMN – hodnota počítadla (hodnota PK) Tato volba generování musí být doplněna o anotaci @TableGenerator – atributy: name – název generátoru, odkazu table – název db tabulky pkColumnName – název sloupce v tabulce pro názvy PK valueColumnName – název sloupce pro hodnoty PK pkColumnValue – název primárního klíče
50
TableGenerator - příklad
51
Generování PK přes sekvenci
Některé DB mají speciální struktury pro generování sekvencí (Oracle) @SequenceGenerator doprovodná anotace name – název generátoru pro odkazování sequence_name – název sekvence v DB initialValue – počáteční hodnota allocationSize – krok alokace
52
Generování přes sekvenci - příklad
53
Složené primární klíče
Někdy je zapotřebí, aby se PK skládal z více primitivních hodnot či řetězců Složený klíč je reprezentován tzv. třídou PK tato třída je přiřazena k entitě @IdClass(třída_pk) Třída PK musí být serializovatelná musí veřejný no-arg konstruktor musí implementovat hash() a equals()
54
Entita se složeným primárním klíčem
Vyhledání podle složeného klíče:
55
Třída primárního klíče - příklad
56
Mapování vlastností entity
@Transient – označení neperzistentních vlastností @Basic, FetchType – mapování primitivních typů @Temporal – mapování časových vlastností @Lob – mapování objemných dat (BLOB, CLOB) @Enumerated – mapování výčtových typů @ElementCollection – mapování kolekcí primitivních typů a řetězců
57
Mapování neperzistentních vlastn.
Někdy chceme mít ve třídě entity vlastnost, kterou si nepřejeme ukládat do databáze Označíme
58
Mapování primitivních typů
Mapování lze řídit fetch – strategie načítání hodnoty; enum FetchType LAZY – hodnota se nahraje při prvním přístupu EAGER – hodnota se nahraje při ihned optional – pokud je true, sloupec je chápán jako nulovatelný (nemusí obsahovat žádnou hodnotu)
59
Mapování časových vlastností
Časové vlastnosti lze mapovat do sloupců typu date, time a timestamp By default se volí timestamp @Temporal(type) enum TemporalType DATE TIME TIMESTAMP Lze použít spolu pro zadání parametrů fetch a optional
60
Mapování objemných dat
JDBC definuje typy Blob a Clob pro objemná binární, resp. znaková data Pomocí lze mapovat vlastnosti entity na tyto typy pokud je typ vlastnosti char[], Character[] nebo java.lang.String -> Clob pokud je typ byte[], Byte[], nebo java.lang.Serializable -> Blob Anotaci lze kombinovat
61
Mapování výčtových typů
Pomocí lze mapovat vlastnosti, jejichž hodnota je výčtového typu @Enumerated(způsob) způsob je typu EnumType a může nabývat hodnot ORDINAL – hodnota ukládána do DB jako číslo (ordinál) STRING – hodnota ukládána do DB jako řetězec Možno použít spolu
62
Mapování kolekcí základních typů
Od verze EJB 3.1 lze mapovat vlastnosti, jejichž hodnota je kolekce základních typů, bez nutnosti vytvářet speciální entitu pro prvky kolekce. @ElementCollection označuje vlastnost, která musí přiřaditelná typu java.util.Collection<T> T musí být obalující třída primitivního typu nebo String atribut fetch určuje okamžik nahrání kolekce @CollectionTable vyladění názvu a vlastností tabulky pro kolekce by default: název = název entity + vlastnost
63
Mapování mapy základních typů
Podobně jako u kolekce základních typů, od EJB 3.1 je možné mapovat mapy základních typů bez nutnosti vytvářet entitu pro dvojice v mapě Znovu se použijí a @CollectionTable Doprovodná určuje sloupec pro klíč mapy v tabulce pro dvojice určuje sloupec pro hodnotu dvojice v mapě
64
Mapování mapy - příklad
Klíčem je CARD_NUMBER, hodnotou CARD_TYPE CLIENT_ID CARD_NUMBER CARD_TYPE 1 MASTERCARD VISA
65
Mapování entity na více tabulek
Někdy je třeba mapovat jednu entitu na dvě tabulky např. v důsledku vývoje nad převzatým modelem Sekundární tabulku lze specifikovat anotací @SecondaryTable name – název sekundární tabulky pkJoinColumns – jeden či více sloupců v sekundární tabulce pro spojovací primární klíč do hlavní tabulky. Hodnotou je sekvence @PrimaryKeyJoinColumn(name=<column_name>)
66
@Embedded objekty JPA umožňuje navrhovat kompozitní entity, tj. entity, které obsahují jiné objekty, které sice nejsou entity, ale jejich vlastnosti jsou mapovány na tabulku hlavní entity. Objekt komponenty je Atribut hlavní entity, který drží komponentu je anotován @Embedded @AttributeOverrides obsahuje – mapování vlastnosti komponenty na sloupec tabulky hlavní entity
67
Komponenta kompozitní entity
Kompozitní entita Client:
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.