Hibernate deve essere in grado di confrontare e serializzare gli identificatori. Quindi la classe identificatore deve essere serializzabile e sovrascrivere hashCode() ed equals() coerentemente con la nozione di equità di chiave composita del database.
Se si dispone di un ID composito mappato come proprietà dell'entità, l'entità stessa è l'identificatore.
Un secondo approccio è chiamato un identificatore composito mappata, dove le proprietà identificatore denominate all'interno del < composite-id > elemento sono duplicati sia sulla classe persistente e una classe identificatore separato
Infine, un composito-id può essere una classe componente. In questo caso la classe componente è la classe identificatore.
Si noti che si consiglia vivamente di avere l'ID una classe separata. Altrimenti avrete solo modi molto imbarazzanti per cercare il vostro oggetto usando session.get() o session.load().
sezioni pertinenti del documentazione Reference:
In questo esempio, un composito-id è mappato come proprietà dell'entità. (Quanto segue presuppone che si stia definendo la classe 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 mappato composite-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()
}
Un componente come un composito-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()
}
fonte
2010-02-20 06:34:51
confondendo esempio. inoltre, cosa è 'dipendente' nell'ID composito? intendevi mettere 'dipartimento'? in entrambi i casi, ancora un esempio confuso. potrebbe essere chiarito facendo commenti per spiegarlo. – KyleM
Se si lascia che l'entità sia l'identificatore, vuol dire che l'uguaglianza e l'hashcode possono usare solo l'ID composito e non altri campi per verificare l'uguaglianza? – CowZow