是否有必要将复合id映射到class?
会是这样的吗?
<composite-id>
<key-property=..../>
<key-property=..../>
</composite-id>或者应该是
<composite-id class=....>
<key-property=..../>
<key-property=..../>
</composite-id>如果我们有组合键,那么这个类应该实现equals()和override()方法吗?
发布于 2010-02-20 14:34:52
Hibernate需要能够比较和序列化标识符。因此标识符类必须是可序列化的,并与数据库的组合键相等概念一致地覆盖hashCode()和equals()。
如果将复合id映射为实体的属性,则实体本身就是标识符。
第二种方法称为映射复合标识符,其中在元素内命名的标识符属性在持久类和单独的标识符类上都是重复的
最后,复合id可以是一个组件类。在本例中,组件类是标识符类。
请注意,强烈建议将ID设置为单独的类。否则,使用session.get()或session.load()查找对象的方法将非常笨拙。
参考文档的相关部分:
在本例中,复合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()
}发布于 2010-03-01 00:19:52
两者都是可能的。如果您使用
<composite-id>
<key-property=..../>
<key-property=..../>
</composite-id>则不需要单独的类来表示密钥。ID值取自实体本身的属性。
如果您使用
<composite-id class="....">
<key-property=..../>
<key-property=..../>
</composite-id>然后,指定的类将用作键属性的持有者。但是,实体类还必须具有这些属性-值同时存储在实体类和复合ID类中。实体类不知道键类。在我看来,这不是很好。
有一种更好的第三种方法,在文档here中描述
<composite-id name="id" class="OrderLineId">
<key-property name="lineId"/>
<key-property name="orderId"/>
<key-property name="customerId"/>
</composite-id>在这里,组合键由类OrderLineId表示,它的一个实例存储在entity类中的字段id下。这使得实体和键之间的分离更加清晰。
发布于 2012-02-21 19:38:17
如果您有一个包含与其他实体的关系的组合键,请这样做:
<composite-id>
<key-many-to-one name="employee" column="FK_EMPLOYEE" entity-name="net.package.name.Employee" />
<key-many-to-one name="department" column="FK_DEPARTMENT" entity-name="net.package.name.Department" />
</composite-id>https://stackoverflow.com/questions/2301259
复制相似问题