Hibernate muss Kennungen vergleichen und serialisieren können. Daher muss die Bezeichnerklasse serialisierbar sein und hashCode() und equals() in Übereinstimmung mit dem Begriff der zusammengesetzten Schlüsselgleichheit der Datenbank überschreiben.
Wenn Sie eine zusammengesetzte ID als Eigenschaften der Entität zugeordnet haben, ist die Entität selbst der Bezeichner.
Ein zweiter Ansatz eine zugeordnetes Verbund Kennung genannt wird, in dem die Kennung benannten Eigenschaften innerhalb des < Composite-id > Elements sowohl auf die persistenten Klasse dupliziert werden und eine separate Kennung Klasse
Schließlich ist eine Verbund-ID kann eine Komponentenklasse sein. In diesem Fall ist die Komponentenklasse die Bezeichnerklasse.
Beachten Sie, dass es dringend empfohlen wird, die ID eine separate Klasse zu haben. Andernfalls haben Sie nur sehr ungünstige Möglichkeiten, Ihr Objekt mit session.get() oder session.load() zu suchen.
Relevante Abschnitte der Referenzdokumentation:
In diesem Beispiel wird eine Verbund-ID als Eigenschaften des Unternehmens abgebildet. (Angenommen, Sie definieren die Klasse Employee).
<composite-id>
<key-property name="EmployeeNumber"/>
<key-property name="Dependent"/>
</composite-id>
class EmployeeAssignment implements Serializable
{
string getEmployeeNumber()
void setEmployeeNumber(string value)
string getDepartment()
void setDepartment(string value)
boolean equals(Object obj)
int hashCode()
}
A kartiert Kompositpartikel-ID:
<composite-id class="EmployeeAssignmentId" mapped="true">
<key-property name="EmployeeNumber"/>
<key-property name="Dependent"/>
</composite-id>
class EmployeeAssignment
{
string getEmployeeNumber()
void setEmployeeNumber(string value)
string getDepartment()
void setDepartment(string value)
}
class EmployeeAssignmentId implements Serializable
{
string getEmployeeNumber()
void setEmployeeNumber(string value)
string getDepartment()
void setDepartment(string value)
boolean equals(Object obj)
int hashCode()
}
eine Komponente als Verbund-ID:
<composite-id name="Id" class="EmployeeAssignmentId">
<key-property name="EmployeeNumber"/>
<key-property name="Dependent"/>
</composite-id>
class EmployeeAssignment
{
EmployeeAssignmentId getId()
void setId(EmployeeAssignmentId value)
}
class EmployeeAssignmentId implements Serializable
{
string getEmployeeNumber()
void setEmployeeNumber(string value)
string getDepartment()
void setDepartment(string value)
boolean equals(Object obj)
int hashCode()
}
Beispiel verwirrend. auch, was ist abhängig von der Composite-ID? Meinst du, Abteilung? so oder so, immer noch ein verwirrendes Beispiel. könnte durch Kommentare geklärt werden, um es zu erklären. – KyleM
Wenn Sie die Entität selbst als Bezeichner angeben lassen, bedeutet das, dass der equals und der hashcode nur die zusammengesetzten IDs und keine anderen Felder verwenden können, um auf Gleichheit zu prüfen? – CowZow