összetett elsődleges kulcsok a JPA-ban
Bevezetés
ebben az oktatóanyagban megismerhetjük az összetett elsődleges kulcsokat és a megfelelő kommentárokat a JPA-ban.
összetett elsődleges kulcsok
az összetett elsődleges kulcs – más néven összetett kulcs – két vagy több oszlop kombinációja, amely egy tábla elsődleges kulcsát képezi.
a JPA-ban két lehetőségünk van az összetett kulcsok meghatározására: a @IdClass és a @EmbeddedId annotációk.
az összetett elsődleges kulcsok meghatározásához néhány szabályt kell követnünk:
- az összetett elsődleges kulcsosztálynak nyilvánosnak kell lennie
- nem-arg konstruktorral kell rendelkeznie
- meg kell határoznia az equals() és a hashCode() metódusokat
- Sorosíthatónak kell lennie
Az IdClass Annotációja
legyen tegyük fel, hogy van egy account nevű táblánk, amelynek két oszlopa van – accountnumber, Accountype–, amelyek alkotják az összetett kulcsot. Most meg kell térképeznünk a JPA-ban.
a JPA specifikáció szerint hozzunk létre egy AccountId osztályt ezekkel az elsődleges kulcsmezőkkel:
public class AccountId implements Serializable { private String accountNumber; private String accountType; // default constructor public AccountId(String accountNumber, String accountType) { this.accountNumber = accountNumber; this.accountType = accountType; } // equals() and hashCode()}
ezután társítsuk a AccountId osztályt az entity fiókkal.
ehhez meg kell jegyeznünk az entitást a @IdClass annotációval. A mezőket az entitás fiók AccountId osztályából is deklarálnunk kell, és @Id-vel kell kommentálnunk őket:
@Entity@IdClass(AccountId.class)public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters}
Az EmbeddedId annotáció
@EmbeddedId a @IdClass annotáció alternatívája.
nézzünk meg egy másik példát, ahol meg kell őriznünk néhány információt egy könyvről, amelynek címe és nyelve az elsődleges kulcsmezők.
ebben az esetben az elsődleges kulcsosztályt, a BookId-t @Embeddable-vel kell kommentálni:
@Embeddablepublic class BookId implements Serializable { private String title; private String language; // default constructor public BookId(String title, String language) { this.title = title; this.language = language; } // getters, equals() and hashCode() methods}
ezután be kell ágyaznunk ezt az osztályt a könyv entitásba a @EmbeddedId használatával:
@Entitypublic class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters}
@IdClass vs @EmbeddedId
mint láttuk, a különbség a felszínen a kettő között az, hogy a @IdClass-szal kétszer kellett megadnunk az oszlopokat – egyszer a AccountId-ben, majd ismét a Account-ban. De a @EmbeddedId-vel nem.
vannak más kompromisszumok is.
például ezek a különböző struktúrák befolyásolják az általunk írt JPQL lekérdezéseket.
például a @IdClass esetén a lekérdezés egy kicsit egyszerűbb:
SELECT account.accountNumber FROM Account account
a @EmbeddedId segítségével egy extra bejárást kell tennünk:
SELECT book.bookId.title FROM Book book
ezenkívül a @IdClass nagyon hasznos lehet olyan helyeken, ahol összetett kulcsosztályt használunk, amelyet nem tudunk módosítani.
végül, ha az összetett kulcs egyes részeit egyenként akarjuk elérni, használhatjuk a @IdClass-t, de azokon a helyeken, ahol gyakran használjuk a teljes azonosítót objektumként, a @EmbeddedId-et részesítjük előnyben.
következtetés
ebben a gyors cikkben a JPA összetett elsődleges kulcsait tárjuk fel.
mint mindig, a cikk teljes kódja megtalálható a Githubon.