Hibernate は、識別子を比較してシリアライズできる必要があります。したがって、識別子クラスはシリアル化可能である必要があり、データベースの複合キーの等価性の概念と一貫して hashCode() および equals() をオーバーライドする必要があります。
エンティティのプロパティとしてマップされた複合 ID がある場合、エンティティ自体が識別子になります。
2 番目のアプローチは、マップされた複合識別子と呼ばれ、 <composite-id> 要素内で名前が付けられた識別子プロパティが、永続クラスと別の識別子クラスの両方で複製されます。
最後に、composite-id はコンポーネント クラスの場合があります。この場合、コンポーネント クラスは識別子クラスです。
ID を別のクラスにすることを強くお勧めします。そうしないと、session.get() または session.load() を使用してオブジェクトを検索する非常に扱いにくい方法しかありません。
リファレンス ドキュメントの関連セクション:
この例では、composite-id がエンティティのプロパティとしてマップされます。(以下では、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()
}
マッピングされた複合 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()
}
複合 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()
}