Hibernate 需要能够比较和序列化标识符。因此标识符类必须是可序列化的,并重写 hashCode() 和 equals() ,与数据库的复合键相等概念一致。
如果您有一个映射为实体属性的复合 ID,则实体本身就是标识符。
第二种方法称为映射复合标识符,其中 元素内命名的标识符属性在持久类和单独的标识符类上重复
最后,composite-id 可以是组件类。在这种情况下,组件类是标识符类。
请注意,强烈建议将 ID 放在单独的类中。否则,您将只能以非常尴尬的方式使用 session.get() 或 session.load() 查找对象。
参考文档的相关部分:
- 复合 ID http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-compositeid
- 作为复合标识符的组件 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/components.html#components-compositeid
在此示例中,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()
}