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.