Chiavi primarie composite in JPA

Introduzione

In questo tutorial, impareremo a conoscere le chiavi primarie composite e le annotazioni corrispondenti in JPA.

Chiavi primarie composite

Una chiave primaria composita, chiamata anche chiave composita, è una combinazione di due o più colonne per formare una chiave primaria per una tabella.

In JPA, abbiamo due opzioni per definire le chiavi composite :Le annotazioni @ IdClass e @ EmbeddedId.

Per definire le chiavi primarie composite, dovremmo seguire alcune regole:

  • chiave primaria composta classe deve essere pubblica
  • deve avere un no-arg costruttore
  • È necessario definire equals() e hashCode() metodi
  • deve essere Serializzabile

Il IdClass Annotazione

supponiamo di avere una tabella denominata Account in due colonne – accountNumber, accountType – che formano la chiave composta. Ora dobbiamo mapparlo in JPA.

Come da specifica JPA, creiamo una classe AccountId con questi campi chiave primaria:

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()}

Quindi, associamo la classe AccountId all’account dell’entità.

Per fare ciò, dobbiamo annotare l’entità con l’annotazione @IdClass. Dobbiamo anche dichiarare i campi dalla classe AccountId nell’account dell’entità e annotarli con @ Id:

@Entity@IdClass(AccountId.class)public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters}

L’annotazione EmbeddedId

@EmbeddedId è un’alternativa all’annotazione @IdClass.

Consideriamo un altro esempio in cui dobbiamo mantenere alcune informazioni di un libro con titolo e lingua come campi chiave primari.

In questo caso, la chiave primaria classe, BookId, deve essere annotata con @Incorporabile:

@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}

Quindi, abbiamo bisogno di incorporare questa classe nel Libro entità @EmbeddedId:

@Entitypublic class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters}

@IdClass vs @EmbeddedId

Come abbiamo appena visto, la differenza di superficie tra questi due è che con @IdClass, abbiamo dovuto specificare le colonne due volte – una volta in AccountId e di nuovo in Considerazione. Ma, con @ EmbeddedId non l’abbiamo fatto.

Ci sono alcuni altri compromessi, però.

Ad esempio, queste diverse strutture influenzano le query JPQL che scriviamo.

Ad esempio, con @IdClass, la query è un po ‘ più semplice:

SELECT account.accountNumber FROM Account account

Con @ EmbeddedId, dobbiamo fare un attraversamento in più:

SELECT book.bookId.title FROM Book book

Inoltre, @ IdClass può essere abbastanza utile nei luoghi in cui stiamo usando una classe di chiavi composite che non possiamo modificare.

Infine, se accediamo individualmente a parti della chiave composita, possiamo utilizzare @IdClass, ma nei luoghi in cui usiamo frequentemente l’identificatore completo come oggetto, @EmbeddedId è preferito.

Conclusione

In questo breve articolo, esploriamo le chiavi primarie composite in JPA.

Come sempre, il codice completo per questo articolo può essere trovato su Github.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.