Zusammengesetzte Primärschlüssel in JPA

1. Einleitung

In diesem Tutorial lernen wir zusammengesetzte Primärschlüssel und die entsprechenden Anmerkungen in JPA kennen.

2. Zusammengesetzte Primärschlüssel

Ein zusammengesetzter Primärschlüssel - auch als zusammengesetzter Schlüssel bezeichnet - ist eine Kombination aus zwei oder mehr Spalten, um einen Primärschlüssel für eine Tabelle zu bilden.

In JPA haben wir zwei Optionen zum Definieren der zusammengesetzten Schlüssel: die Annotationen @IdClass und @EmbeddedId .

Um die zusammengesetzten Primärschlüssel zu definieren, sollten wir einige Regeln befolgen:

  • Die zusammengesetzte Primärschlüsselklasse muss öffentlich sein
  • Es muss einen Konstruktor ohne Argumente haben
  • Es muss die Methoden equals () und hashCode () definieren
  • Es muss sein , S erializable

3. Die IdClass- Annotation

Angenommen , wir haben eine Tabelle mit dem Namen Account und zwei Spalten - accountNumber, accountType - , die den zusammengesetzten Schlüssel bilden. Jetzt müssen wir es in JPA abbilden.

Erstellen Sie gemäß der JPA-Spezifikation eine AccountId- Klasse mit den folgenden Primärschlüsselfeldern:

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

Als nächstes wollen wir die assoziieren AccountId Klasse mit der Entität Konto .

Dazu müssen wir die Entität mit der Annotation @IdClass versehen . Wir müssen auch die Felder aus der deklarieren AccountId Klasse in der Entität Konto und mit Anmerkungen versehen sie mit @Id :

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

4. Die EmbeddedId- Annotation

@EmbeddedId ist eine Alternative zur Annotation @IdClass .

Betrachten wir ein weiteres Beispiel, in dem wir einige Informationen eines Buches mit Titel und Sprache als Primärschlüsselfeldern beibehalten müssen.

In diesem Fall muss die Primärschlüsselklasse BookId mit @Embeddable versehen werden :

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

Dann müssen wir diese Klasse im einzubetten B ook Einheit mit @EmbeddedId :

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

5. @IdClass vs @EmbeddedId

Wie wir gerade gesehen haben, besteht der Unterschied auf der Oberfläche zwischen diesen beiden darin, dass wir bei @IdClass die Spalten zweimal angeben mussten - einmal in AccountId und erneut in Account. Aber mit @EmbeddedId haben wir nicht.

Es gibt jedoch einige andere Kompromisse.

Diese unterschiedlichen Strukturen wirken sich beispielsweise auf die von uns geschriebenen JPQL-Abfragen aus.

Mit @IdClass ist die Abfrage beispielsweise etwas einfacher:

SELECT account.accountNumber FROM Account account

Mit @EmbeddedId müssen wir eine zusätzliche Durchquerung durchführen:

SELECT book.bookId.title FROM Book book

Außerdem kann @IdClass an Stellen sehr nützlich sein, an denen wir eine zusammengesetzte Schlüsselklasse verwenden, die wir nicht ändern können.

Schließlich, wenn wir individuell auf Zugang Teile des zusammengesetzten Schlüssels gehen, können wir nutzen @IdClass, sondern an Orten , wo wir häufig die vollständige Kennung als ein Objekt verwenden, @EmbeddedId bevorzugt.

6. Fazit

In diesem kurzen Artikel untersuchen wir zusammengesetzte Primärschlüssel in JPA.

Wie immer finden Sie den vollständigen Code für diesen Artikel auf Github.