złożone klucze podstawowe w JPA
wprowadzenie
w tym samouczku dowiemy się o złożonych kluczach podstawowych i odpowiednich adnotacjach w JPA.
złożone klucze podstawowe
złożony klucz podstawowy – zwany również kluczem złożonym – jest kombinacją dwóch lub więcej kolumn, tworząc klucz podstawowy dla tabeli.
w JPA mamy dwie opcje definiowania kluczy złożonych: adnotacje @IdClass i @EmbeddedId.
aby zdefiniować złożone klucze podstawowe, powinniśmy przestrzegać pewnych reguł:
- Klasa złożonego klucza podstawowego musi być Publiczna
- musi mieć konstruktor bez arg
- musi zdefiniować metody equals() i hashCode ()
- musi być Serializowalna
Adnotacja klasy ID
Let powiedzmy, że mamy tabelę o nazwie account i ma dwie kolumny-accountnumber, Accounttype – które tworzą klucz złożony. Teraz musimy to zmapować w JPA.
zgodnie ze specyfikacją JPA, stwórzmy klasę AccountId z tymi polami klucza podstawowego:
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()}
następnie powiążmy klasę AccountId z kontem podmiotu.
aby to zrobić, musimy adnotować encję adnotacją @IdClass. Musimy również zadeklarować pola z klasy AccountId na koncie entity i opatrzyć je adnotacją @Id:
@Entity@IdClass(AccountId.class)public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters}
Adnotacja EmbeddedId
@EmbeddedId jest alternatywą dla adnotacji @ IdClass.
rozważmy inny przykład, w którym musimy zachować pewne informacje o książce z tytułem i językiem jako podstawowymi polami klucza.
w tym przypadku podstawowa klasa klucza, BookId, musi być opatrzona adnotacją @ Embeddable:
@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}
następnie musimy osadzić tę klasę w encji książki za pomocą @EmbeddedId:
@Entitypublic class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters}
@IdClass vs @EmbeddedId
jak przed chwilą zobaczyliśmy, różnica między tymi dwoma polega na tym, że w przypadku @IdClass musieliśmy podać kolumny dwa razy – raz w AccountId i ponownie w Account. Ale z @ EmbeddedId nie.
są jednak inne kompromisy.
na przykład te różne struktury wpływają na zapytania JPQL, które piszemy.
na przykład w przypadku @IdClass zapytanie jest nieco prostsze:
SELECT account.accountNumber FROM Account account
z @ EmbeddedId, musimy zrobić jeden dodatkowy Trawers:
SELECT book.bookId.title FROM Book book
ponadto, @IdClass może być bardzo użyteczny w miejscach, w których używamy klasy klucza złożonego, którego nie możemy modyfikować.
wreszcie, jeśli chcemy uzyskać dostęp do części klucza złożonego indywidualnie, możemy użyć @IdClass, ale w miejscach, gdzie często używamy pełnego identyfikatora jako obiektu, preferowany jest @EmbeddedId.
podsumowanie
w tym krótkim artykule zbadamy złożone klucze podstawowe w JPA.
jak zawsze, Pełny kod tego artykułu można znaleźć na Githubie.