In diesem Code wird erläutert, wie eine Java-Klasse für den zusammengesetzten Schlüssel generiert wird (wie ein zusammengesetzter Schlüssel im Ruhezustand erstellt wird):
create table Time (
levelStation int(15) not null,
src varchar(100) not null,
dst varchar(100) not null,
distance int(15) not null,
price int(15) not null,
confPathID int(15) not null,
constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Antworten:
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:Mit einem
IdClass
Die Klasse für den zusammengesetzten Primärschlüssel könnte folgendermaßen aussehen (könnte eine statische innere Klasse sein):
Und die Entität:
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):
Und die Entität:
Die
@EmbeddedId
Annotation ordnet eine PK-Klasse der Tabelle PK zu.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):
mit
IdClass
mit
EmbeddedId
Verweise
quelle
id
immernull
generiert wird und nicht generiert wird: /@IdClass
es um Folgendes: "Es wurde aus Gründen der Abwärtskompatibilität aus dem dunklen Zeitalter von EJB 2 geerbt, und wir empfehlen, es aus Gründen der Einfachheit nicht zu verwenden."Sie müssen verwenden
@EmbeddedId
:quelle
Wie ich in diesem Artikel erklärt habe , vorausgesetzt, Sie haben die folgenden Datenbanktabellen:
Zunächst müssen Sie den Speicher erstellen, der
@Embeddable
die zusammengesetzte Kennung enthält:Mit dieser Option können wir die
Employee
Entität zuordnen, die den zusammengesetzten Bezeichner verwendet, indem wir sie mit@EmbeddedId
folgenden Anmerkungen versehen :Die
Phone
Entität, zu der eine@ManyToOne
Zuordnung bestehtEmployee
, muss über zwei@JoinColumn
Zuordnungen auf den zusammengesetzten Bezeichner aus der übergeordneten Klasse verweisen :Weitere Informationen finden Sie in diesem Artikel .
quelle
Die Primärschlüsselklasse muss die Methoden equals und hashCode definieren
Technischer: Sie sollten das Liskows-Substitutionsprinzip befolgen und die Symmetrizität ignorieren.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
quelle
Sieht so aus, als würden Sie das von Grund auf neu machen. Versuchen Sie, verfügbare Reverse Engineering-Tools wie Netbeans Entities from Database zu verwenden, um zumindest die Grundlagen zu automatisieren (wie eingebettete IDs). Dies kann zu großen Kopfschmerzen führen, wenn Sie viele Tabellen haben. Ich schlage vor, das Rad nicht neu zu erfinden und so viele Werkzeuge wie möglich zu verwenden, um die Codierung auf das Minimum und das Wichtigste zu reduzieren, was Sie vorhaben.
quelle
Nehmen wir ein einfaches Beispiel. Nehmen wir an, zwei Tabellen werden benannt
test
undcustomer
dort beschrieben als:Es gibt noch eine Tabelle, die den Überblick über
test
s undcustomer
:Wir können sehen, dass in der Tabelle
tests_purchased
der Primärschlüssel ein zusammengesetzter Schlüssel ist, daher werden wir das<composite-id ...>...</composite-id>
Tag in derhbm.xml
Zuordnungsdatei verwenden. DasPurchasedTest.hbm.xml
wird also so aussehen:Aber hier endet es nicht. Im Ruhezustand verwenden wir session.load (
entityClass
,id_type_object
), um die Entität mithilfe des Primärschlüssels zu finden und zu laden. Bei zusammengesetzten Schlüsseln sollte das ID-Objekt eine separate ID-Klasse sein (im obigen Fall einePurchasedTestId
Klasse), die nur die Primärschlüsselattribute wie folgt deklariert :Wichtig ist, dass wir auch die beiden Funktionen implementieren
hashCode()
und unsequals()
im Ruhezustand darauf verlassen.quelle
Eine andere Option ist die Zuordnung als Karte zusammengesetzter Elemente in der ConfPath-Tabelle.
Diese Zuordnung würde jedoch von einem Index für (ConfPathID, levelStation) profitieren.
Kartierung:
quelle
Zusammengesetzte Schlüsselklasse
Entitätsklasse
quelle