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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.