Kompozit elsődleges kulcsok a JPA-ban

1. Bemutatkozás

Ebben az oktatóanyagban megismerhetjük az elsődleges összetett kulcsokat és a JPA megfelelő kommentárjait.

2. Kompozit 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áblázat elsődleges kulcsát alkotja.

A JPA-ban két lehetőségünk van az összetett kulcsok meghatározására: A @IdClass és @EmbeddedId annotációk.

Az összetett elsődleges kulcsok meghatározásához néhány szabályt kell betartanunk:

  • Az összetett elsődleges kulcsosztálynak nyilvánosnak kell lennie
  • Ennek tartalmaznia kell egy argum nélküli konstruktort
  • Meg kell határoznia egyenlő () és hash kód() mód
  • Kell lennie Serializálható

3. Az IdClass Megjegyzés

Tegyük fel, hogy van egy nevezett asztalunk Számla és két oszlopa van - accountNumber, accountType - amelyek az összetett kulcsot alkotják. Most a JPA-ban kell feltérképeznünk.

A JPA specifikációja szerint hozzunk létre egy Felhasználónév osztály az alábbi elsődleges kulcsmezőkkel:

public class AccountId megvalósítja a Serializable {private String accountNumber; privát String accountType; // alapértelmezett konstruktor public AccountId (String accountNumber, String accountType) {this.accountNumber = accountNumber; this.accountType = accountType; } // egyenlő () és hashCode ()}

Ezután társítsuk a Felhasználónév osztály az entitással Számla.

Ehhez meg kell jegyeznünk az entitást a @IdClass annotáció. Deklarálnunk kell a mezőket is a Felhasználónév osztály az entitásban Számla és annotálja őket @Id:

@Entity @IdClass (AccountId.class) public class Account {@Id private String accountNumber; @Id private String accountType; // egyéb mezők, getterek és beállítók}

4. A EmbeddedId Megjegyzés

@EmbeddedId alternatívája a @IdClass annotáció.

Vegyünk egy másik példát, ahol meg kell tartanunk a Könyv val vel cím és nyelv mint elsődleges kulcsmezők.

Ebben az esetben az elsődleges kulcsosztály, BookId, jelöléssel kell ellátni @ Beágyazható:

@ A beágyazható nyilvános osztály BookId megvalósítja a Serializable {private String címet; privát String nyelv; // alapértelmezett konstruktor public BookId (karakterlánc címe, karakterlánc nyelve) {this.title = title; ez.nyelv = nyelv; } // getters, egyenlő () és hashCode () módszerek}

Ezután be kell ágyaznunk ezt az osztályt a Book entitás használ @EmbeddedId:

@Entity public class Book {@EmbeddedId private BookId bookId; // kivitelezők, egyéb mezők, szerelők és beállítók}

5. @IdClass vs. @EmbeddedId

Amint éppen láttuk, a kettő között a felszínen az a különbség, hogy a @IdClass, kétszer kellett megadnunk az oszlopokat - egyszer be Felhasználónév és újra be Számla. De, azzal @EmbeddedId nem tettük.

Van néhány más kompromisszum 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 azzal @IdClass, a lekérdezés valamivel egyszerűbb:

Válassza ki a account.accountNumber FROM számlafiókot

Val vel @EmbeddedId, meg kell végeznünk egy extra bejárást:

Válassza ki a book.bookId.title-t a Book book-ból

Is, @IdClass nagyon hasznos lehet olyan helyeken, ahol miolyan összetett kulcsosztályt használnak, amelyet nem tudunk módosítani.

Végül, ha az összetett kulcs egyes részeihez külön-külön szeretnénk hozzáférni, használhatjuk @IdClass, de olyan helyeken, ahol gyakran a teljes azonosítót használjuk objektumként, @EmbeddedId előnyös.

6. Következtetés

Ebben a gyors cikkben az összetett elsődleges kulcsokat vizsgáljuk meg a JPA-ban.

Mint mindig, a cikk teljes kódja megtalálható a Github oldalon.