`

Hibernate实体的equals和hashcode

阅读更多
讨论引发自这里:
http://www.iteye.com/topic/8946

以下是我自己的感触。
equals实际上是java判断两个对象是否相等的一个依据;而在set、map这样的存储位置与hashcode的集合中, hashcode起着计算位置的作用,同时又要满足一个约定:equals相等,则hashcode必然相等。

基于以上,hibernate实体的Entity也需要做出如下策略:
1)怎样才是相等实体对象
2)在set、map这样的跟hashcide有关的集合映射时,如何保证相等对象hashcode也相等。

可以看出关键还是如何决定两个实体对象是否相等,至于hashcode其实根据equals去实现的。
许多人提出来用实体对象的id来判断是否相等,这其实源于hibernate的持久对象管理机制。Hibernate利用id属性来管理一类持久对象,对于session中的一类持久对象,id是唯一的,因此id用作某一类持久对象的标识符是合适的。

那么否针对id判断实体相等就是合理的策略了吗?
关键还是看你怎样才认为实体对象是相等的,这个倒不能采取hibernate对id的特殊用法。
如果认为业务属性无所谓,只要id相等就相等,那就完全可以用id作为判断相等的依据。
如果需要根据业务属性来判定,那么id就不是合理的策略,因为很可能id不等但是业务属性都相等。
如果不是那么关心重复的实体对象,因此就不会覆盖equals和hashcode方法,直接沿用Object的也是可以的,实际上很多时候我们都是这样做的。
经过仔细的思考,发现这种提出这种讨论本身都是夸大了问题。equals和hashcode根本不是hibernate提出的新概念和新要求。

针对以上的分析,有没有最佳实践呢?
看看Hibernate in action,有三种方法:
1. 就是的这种用无意义主键id做hashCode/equals
2. 就是用的所有值做hashCode/equals
3. 用一个(或者几个)相对稳定的业务字段做hashCode/equals (比如user, 就用userName).
hibernate 推荐的是第3种, 按照这种推荐的做法, 就不会出现以上说的所有问题了, 这差不多是最佳的实践了.

当然如果不知道如何依据业务属性来做相等判断时,只要这样:
在BaseEntity中,根据id来覆写equals和hashcode
有特别需要的子类中,根据业务属性来做equals和hashcode
分享到:
评论
1 楼 linsky_hz@163.com 2008-07-18  

相关推荐

    Hibernate中文API大全

    它必须重新实现equals()和hashCode()方法, 始终和组合关键字在数据库中的概念保持一致 注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合...

    Hibernate+中文文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    hibernate3.2中文文档(chm格式)

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    HibernateAPI中文版.chm

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate注释大全收藏

    以上所有实体使用 JOINED 策略 Ferry和Boat class使用同名的主键关联(eg: Boat.id = Ferry.id), AmericaCupClass 和 Boat 关联的条件为 Boat.id = AmericaCupClass.BOAT_ID. 从父类继承的属性 @MappedSuperclass ...

    Hibernate 中文 html 帮助文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. ...

    Hibernate中文详细学习文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    hibernate 教程

    实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...

    最全Hibernate 参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    hibernate 体系结构与配置 参考文档(html)

    实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate教程

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...

    Hibernate3的帮助文档

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...

    hibernate3.04中文文档.chm

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. ...

    Hibernate3+中文参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...

    hibernate

    实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...

    Hibernate参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. ...

    hibernate 框架详解

    实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class ...

    Java常见面试题208道.docx

    3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 4.final 在 java 中有什么作用? 5.java 中的 Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们...

    hibernate_reference中文文档.pdf

    4.3. 实现 equals() 和 hashCode() 方法: ................................... 54 4.4. 动态模型(Dynamic models) ............................................ 55 4.5. 元组片断映射(Tuplizers) .............

Global site tag (gtag.js) - Google Analytics