Um einen zusammengesetzten Schlüssel zuzuordnen, können Sie die Anmerkungen EmbeddedId
oder verwendenIdClass
. Ich weiß, dass es bei dieser Frage nicht ausschließlich um JPA geht, aber es gelten auch die in der Spezifikation definierten Regeln. Also hier sind sie:
2.1.4 Primärschlüssel und Entitätsidentität
...
Ein zusammengesetzter Primärschlüssel muss entweder einem einzelnen persistenten Feld oder einer Eigenschaft entsprechen oder einer Reihe solcher Felder oder Eigenschaften, wie nachstehend beschrieben. Eine Primärschlüsselklasse muss definiert werden, um einen zusammengesetzten Primärschlüssel darzustellen. Zusammengesetzte Primärschlüssel entstehen normalerweise bei der Zuordnung aus älteren Datenbanken, wenn der Datenbankschlüssel aus mehreren Spalten besteht. Die Anmerkungen EmbeddedId
und
IdClass
werden verwendet, um zusammengesetzte Primärschlüssel zu bezeichnen. Siehe Abschnitte 9.1.14 und 9.1.15.
...
Die folgenden Regeln gelten für zusammengesetzte Primärschlüssel:
- Die Primärschlüsselklasse muss öffentlich sein und einen öffentlichen Konstruktor ohne Argumente haben.
- Wenn ein eigenschaftsbasierter Zugriff verwendet wird, müssen die Eigenschaften der Primärschlüsselklasse öffentlich oder geschützt sein.
- Die Primärschlüsselklasse muss sein
serializable
.
- Die Primärschlüsselklasse muss
equals
und hashCode
Methoden definieren . Die Semantik der Wertgleichheit für diese Methoden muss mit der Datenbankgleichheit für die Datenbanktypen übereinstimmen, denen der Schlüssel zugeordnet ist.
- Ein zusammengesetzter Primärschlüssel muss entweder als einbettbare Klasse dargestellt und zugeordnet werden (siehe Abschnitt 9.1.14, „EmbeddedId-Annotation“) oder muss dargestellt und mehreren Feldern oder Eigenschaften der Entitätsklasse zugeordnet werden (siehe Abschnitt 9.1.15, „IdClass“) Anmerkung").
- Wenn die zusammengesetzte Primärschlüsselklasse mehreren Feldern oder Eigenschaften der Entitätsklasse zugeordnet ist, müssen die Namen der Primärschlüsselfelder oder -eigenschaften in der Primärschlüsselklasse und die der Entitätsklasse übereinstimmen und ihre Typen müssen identisch sein.
Mit einem IdClass
Die Klasse für den zusammengesetzten Primärschlüssel könnte folgendermaßen aussehen (könnte eine statische innere Klasse sein):
public class TimePK implements Serializable {
protected Integer levelStation;
protected Integer confPathID;
public TimePK() {}
public TimePK(Integer levelStation, Integer confPathID) {
this.levelStation = levelStation;
this.confPathID = confPathID;
}
// equals, hashCode
}
Und die Entität:
@Entity
@IdClass(TimePK.class)
class Time implements Serializable {
@Id
private Integer levelStation;
@Id
private Integer confPathID;
private String src;
private String dst;
private Integer distance;
private Integer price;
// getters, setters
}
Die IdClass
Anmerkung ordnet der Tabelle PK mehrere Felder zu.
Mit EmbeddedId
Die Klasse für den zusammengesetzten Primärschlüssel könnte folgendermaßen aussehen (könnte eine statische innere Klasse sein):
@Embeddable
public class TimePK implements Serializable {
protected Integer levelStation;
protected Integer confPathID;
public TimePK() {}
public TimePK(Integer levelStation, Integer confPathID) {
this.levelStation = levelStation;
this.confPathID = confPathID;
}
// equals, hashCode
}
Und die Entität:
@Entity
class Time implements Serializable {
@EmbeddedId
private TimePK timePK;
private String src;
private String dst;
private Integer distance;
private Integer price;
//...
}
Die @EmbeddedId
Annotation ordnet eine PK-Klasse der Tabelle PK zu.
Unterschiede:
- Aus Sicht des physikalischen Modells gibt es keine Unterschiede
@EmbeddedId
kommuniziert irgendwie klarer, dass der Schlüssel ein zusammengesetzter Schlüssel ist und IMO sinnvoll ist, wenn das kombinierte pk entweder selbst eine sinnvolle Entität ist oder in Ihrem Code wiederverwendet wird .
@IdClass
Es ist nützlich anzugeben, dass eine Kombination von Feldern eindeutig ist, diese jedoch keine besondere Bedeutung haben .
Sie wirken sich auch auf die Art und Weise aus, wie Sie Abfragen schreiben (wodurch sie mehr oder weniger ausführlich sind):
Verweise
- JPA 1.0-Spezifikation
- Abschnitt 2.1.4 "Primärschlüssel und Entitätsidentität"
- Abschnitt 9.1.14 "EmbeddedId Annotation"
- Abschnitt 9.1.15 "IdClass Annotation"