ö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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.