首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate组合键

hibernate组合键
EN

Stack Overflow用户
提问于 2010-02-20 14:03:15
回答 3查看 46.7K关注 0票数 8

是否有必要将复合id映射到class?

会是这样的吗?

代码语言:javascript
复制
<composite-id>
  <key-property=..../>
  <key-property=..../>
</composite-id>

或者应该是

代码语言:javascript
复制
<composite-id class=....>
  <key-property=..../>
  <key-property=..../>
</composite-id>

如果我们有组合键,那么这个类应该实现equals()override()方法吗?

EN

回答 3

Stack Overflow用户

发布于 2010-02-20 14:34:52

Hibernate需要能够比较和序列化标识符。因此标识符类必须是可序列化的,并与数据库的组合键相等概念一致地覆盖hashCode()和equals()。

如果将复合id映射为实体的属性,则实体本身就是标识符。

第二种方法称为映射复合标识符,其中在元素内命名的标识符属性在持久类和单独的标识符类上都是重复的

最后,复合id可以是一个组件类。在本例中,组件类是标识符类。

请注意,强烈建议将ID设置为单独的类。否则,使用session.get()或session.load()查找对象的方法将非常笨拙。

参考文档的相关部分:

  • composite-id
  • Components as composite identifiers

在本例中,复合id被映射为实体的属性。(下面假设您正在定义Employee类)。

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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的组件:

代码语言:javascript
复制
<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()
}
票数 26
EN

Stack Overflow用户

发布于 2010-03-01 00:19:52

两者都是可能的。如果您使用

代码语言:javascript
复制
<composite-id>
  <key-property=..../>
  <key-property=..../>
</composite-id>

则不需要单独的类来表示密钥。ID值取自实体本身的属性。

如果您使用

代码语言:javascript
复制
<composite-id class="....">
  <key-property=..../>
  <key-property=..../>
</composite-id>

然后,指定的类将用作键属性的持有者。但是,实体类还必须具有这些属性-值同时存储在实体类和复合ID类中。实体类不知道键类。在我看来,这不是很好。

有一种更好的第三种方法,在文档here中描述

代码语言:javascript
复制
<composite-id name="id" class="OrderLineId">
    <key-property name="lineId"/>
    <key-property name="orderId"/>
    <key-property name="customerId"/>
</composite-id>

在这里,组合键由类OrderLineId表示,它的一个实例存储在entity类中的字段id下。这使得实体和键之间的分离更加清晰。

票数 4
EN

Stack Overflow用户

发布于 2012-02-21 19:38:17

如果您有一个包含与其他实体的关系的组合键,请这样做:

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2301259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档