Ich halte das @EmbeddedIdwahrscheinlich für ausführlicher, da @IdClassSie mit keinem Feldzugriffsoperator auf das gesamte Primärschlüsselobjekt zugreifen können. Mit dem können @EmbeddedIdSie 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 @IdClassund @EmbeddedIdist, wenn es darum geht, HQL zu schreiben:
Mit @IdClassdir schreiben:
Wählen Sie e.name aus Mitarbeiter e
und mit @EmbeddedIddir 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.
@IdClassauch wenn ich dies@EmbeddedIdin den meisten Situationen bevorzuge ( Ich habe dies aus einer Sitzung von Antonio Goncalves erfahren. Er schlug vor, dass wir den@IdClassFall 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@IdClassgeben uns einen Weg unsere.