Ich halte das @EmbeddedId
wahrscheinlich für ausführlicher, da @IdClass
Sie mit keinem Feldzugriffsoperator auf das gesamte Primärschlüsselobjekt zugreifen können. Mit dem können @EmbeddedId
Sie Folgendes tun:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
Dies gibt eine klare Vorstellung von den Feldern, aus denen der zusammengesetzte Schlüssel besteht, da sie alle in einer Klasse zusammengefasst sind, auf die über einen Feldzugriffsoperator zugegriffen wird.
Ein weiterer Unterschied zu @IdClass
und @EmbeddedId
ist, wenn es darum geht, HQL zu schreiben:
Mit @IdClass
dir schreiben:
Wählen Sie e.name aus Mitarbeiter e
und mit @EmbeddedId
dir muss schreiben:
Wählen Sie e.employeeId.name aus Employee e
Sie müssen mehr Text für dieselbe Abfrage schreiben. Einige mögen argumentieren, dass sich dies von einer natürlicheren Sprache wie der von unterscheidet IdClass
. In den meisten Fällen ist es jedoch von unschätzbarem Wert, direkt anhand der Abfrage zu verstehen, dass ein bestimmtes Feld Teil des zusammengesetzten Schlüssels ist.
@IdClass
auch wenn ich dies@EmbeddedId
in den meisten Situationen bevorzuge ( Ich habe dies aus einer Sitzung von Antonio Goncalves erfahren. Er schlug vor, dass wir den@IdClass
Fall für den Fall des Komposits verwenden könnten Schlüsselklasse ist nicht zugänglich oder kommt von einem anderen Modul oder Legacy-Code, wo wir keine Annotation hinzufügen können. In diesen Szenarien@IdClass
geben uns einen Weg unsere.