JPA @Embedded And @Embeddable
1. Pregled
U ovom uputstvu vidjet ćemo kako možemo mapirati jedan entitet koji sadrži ugrađena svojstva u jednu tablicu baze podataka.
U tu svrhu koristit ćemo @Embeddable i @Ugrađen napomene koje pruža Java Persistence API (JPA).
2. Kontekst modela podataka
Prije svega, definirajmo tablicu tzv društvo.
The društvo tablica će pohraniti osnovne podatke poput naziva tvrtke, adrese i telefona, kao i podatke kontakt osobe:
javna klasa tvrtke {private Integer id; privatni naziv niza; privatna string adresa; privatni String telefon; private String contactFirstName; privatni niz contactLastName; privatni String kontaktPhone; // standardni getteri, postavljači}
Čini se da bi kontakt osoba trebala biti apstrahirana u zaseban razred. Problem je u tome ne želimo stvoriti zasebnu tablicu za te detalje. Pa, da vidimo što možemo učiniti.
3. @Embeddable
JPA pruža @Embeddable napomena kojom se izjavljuje da će klasu ugraditi drugi entiteti.
Definirajmo razred za apstrahiranje podataka o kontaktnoj osobi:
@Embeddable javna klasa ContactPerson {private String firstName; private String lastName; privatni String telefon; // standardni getteri, postavljači}
4. @Ugrađen
Napomena JPA @Ugrađen koristi se za ugrađivanje tipa u drugi entitet.
Idemo dalje izmijeniti naš Društvo razred. Dodati ćemo JPA napomene, a promijenit ćemo i upotrebu Osoba za kontakt umjesto zasebnih polja:
@Entity javna tvrtka tvrtke {@Id @GeneratedValue private Integer id; privatni naziv niza; privatna string adresa; privatni String telefon; @ Ugrađeni privatni ContactPerson contactPerson; // standardni getteri, postavljači}
Kao rezultat, imamo svoj entitet Društvo, ugrađivanje podataka o kontaktnoj osobi i mapiranje u jednu tablicu baze podataka.
Ipak, imamo još jedan problem, a to je kako će JPA preslikati ta polja u stupce baze podataka.
5. Nadjačavanje atributa
Stvar je u tome što su se naša polja nazivala stvarima poput contactFirstName u našem originalu Društvo razreda i sada ime u našem Osoba za kontakt razred. Dakle, JPA će ih htjeti mapirati kontakt_prvo_ime i ime, odnosno.
Osim što je manje od idealnog, zapravo će nas slomiti s našim sada dupliciranim telefon stupac.
Dakle, možemo koristiti @AttributeOverrides i @AttibuteOverride da nadjača svojstva stupaca našeg ugrađenog tipa.
Dodajmo ovo u Osoba za kontakt polje u našem Društvo entitet:
@Embedded @AttributeOverrides ({@AttributeOverride (name = "firstName", column = @Column (name = "contact_first_name")), @AttributeOverride (name = "lastName", column = @Column (name = "contact_last_name")), @AttributeOverride (name = "phone", column = @Column (name = "contact_phone"))}) private ContactPerson contactPerson;
Imajte na umu da, budući da ove bilješke idu na terenu, možemo imati različite nadjačavanja za svaki entitet koji obuhvaća.
6. Zaključak
U ovom smo uputstvu konfigurirali entitet s nekim ugrađenim atributima i preslikali ih u istu tablicu baze podataka kao i entitet koji ga obuhvaća. Za to smo koristili @Ugrađen, @Embeddable, @AttributeOverrides i @AttributeOverride napomene koje pruža Java Persistent API.
Kao i uvijek, izvorni kod primjera dostupan je na GitHubu.