`

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  

相关推荐

    Hibernate5.0用户手册中文版本

    5. 实现 equals() 与 hashCode() 方法: 实体对象必须提供 equals() 和 hashCode() 方法来确保对象的唯一性。 Bootstrap(引导、启动) Hibernate 的引导过程是指将 Hibernate 集成到应用程序中的过程。该过程主要...

    IDEA表生成实体类注解,配使用步骤说明

    在此步骤,你可以指定生成实体类的命名策略,字段是否大写,是否生成equals()和hashCode()方法等。还可以选择是否生成ToString方法,以及是否使用Lombok库来简化代码。 7. **生成和查看实体类** 确认设置无误后,...

    Hibernate电子书(全)

    为了确保Hibernate能够正确地识别和处理Java对象,开发者需要重写`equals()`和`hashCode()`方法,以便Hibernate能够根据对象的业务逻辑判断对象是否相等。 #### 多对一与一对多实体映射 在关系数据库中,多对一和一...

    《深入浅出Hibernate》读书笔记

    默认情况下,对象的比较是通过主键值进行的,若需要自定义比较逻辑,需要重写equals()和hashCode()方法。Hibernate通过内部的"EntityEntry"数据结构跟踪实体对象的状态,用于检测数据对象的变化。数据对象的变更检查...

    Hibernate5中文用户使用手册

    POJO模型中,实体类需要实现无参构造函数、提供标识属性、使用非final类以及为持久化属性声明get和set方法,并且实现equals()与hashCode()方法。动态模型指的是使用HQL或JPQL进行查询和操作数据。 引导和启动:...

    hibernate 参考手册

    3. **equals()和hashCode()方法**:解释了在使用集合时,持久化类需要正确覆盖equals()和hashCode()方法。 4. **动态模型和元组片断映射**:讨论了如何实现动态的ORM模型,以及如何使用元组片断映射到不同的数据库...

    HibernateSynchronizer(2.3.1 & 3.1.9)

    1. **新特性**:3.1.9版本在2.3.1的基础上增加了更多的自定义选项,如生成的实体类是否启用懒加载、是否生成equals()和hashCode()方法等。 2. **性能优化**:针对大量表的同步,3.1.9版本进行了性能提升,处理速度...

    HIBERNATE doc_document_官方文档_4.3.6_final_2014_8

    - **继承的实现、equals()和hashCode()方法的实现、动态模型、Tuplizers、实体名称解析器**: 这些是更高级的ORM概念,说明了如何在Hibernate中实现继承、对象比较以及在运行时处理对象模型的变化。 - **Hibernate...

    Hibernate中对数据库复合主键的支持.pdf

    #### 四、Hibernate实体类的设计 为了使Hibernate能够正确地处理复合主键,对应的Java实体类也需要进行相应的设计。具体来说,实体类需要满足以下几点要求: 1. **实现Serializable接口**:这是为了确保实体对象...

    Hibernate Reference

    “Persistent Classes”部分讨论了持久化类的设计准则,包括简单的POJO示例、继承的实现、equals()和hashCode()方法的重写、动态模型的应用、Tuplizers的概念等。这些原则有助于开发者编写出既符合Hibernate规范又...

    自定义 Hibernate Tools 的模板

    例如,你可以决定实体类的属性是否包含 getter 和 setter 方法,或者是否生成 equals() 和 hashCode() 方法。 以下是一些关键知识点: 1. **Hibernate 逆向工程**: 逆向工程是将现有的数据库结构转化为 Hibernate ...

    Hibernate注解映射联合主键

    在Java的持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据模型设计,用于处理具有多个字段作为主键的实体。联合主键通常在数据表中的某些列共同决定了唯一标识的情况出现。在Hibernate中,有三种...

    Hibernate5用户手册中文版

    着重讲解了Hibernate如何通过POJO模型来表示业务对象,并且对POJO模型中的类特性提出了具体要求,例如无参构造器、标识属性、非final类的使用、持久化属性的getter和setter方法以及重写equals()和hashCode()方法。...

    hibernate反向工程

    可以定制是否生成getter/setter方法、构造函数、equals()和hashCode()等。 6. **执行反向工程**:启动反向工程过程,IDE将自动根据数据库中的表结构生成对应的Java实体类和映射文件。生成的实体类通常包含字段属性...

    hibernate_reference使用指南全

    - **4.3 实现 equals() 和 hashCode() 方法** 为了确保 Hibernate 正确处理对象的唯一性,需要为持久化类实现这两个方法。 - **4.4 动态模型** 介绍如何使用 Hibernate 的动态元数据映射来处理结构不确定的数据...

    BONC_Hibernate

    - **实现equals()和hashCode()方法**:确保实体对象正确比较和存储。 - **动态模型**:动态生成实体类的机制。 - **元组片段映射**:高级映射技术之一。 5. **对象/关系数据库映射基础** - **映射定义**:包括...

    hibernate笔记

    12. **实现equals()和hashCode()**:为了保证集合类(如Set)的正确性和对象的唯一性,需要在实体类中重写`equals()`和`hashCode()`方法,确保基于业务逻辑的比较。 13. **多对一实体映射**:在多对一关系中,一个...

    HibernateTools 工具

    此外,它还能根据需求生成一些额外的方法,如`toString()`、`equals()`和`hashCode()`,进一步提高了开发的便捷性。 4. **其他功能** HibernateTools还支持数据库脚本的生成和执行,允许用户在数据库之间迁移数据...

    hibernate3 注释生成复合主键或者嵌入式主键的方法及实例.doc

    这里,`equals()`方法主要比较`userId`和`roleId`的值是否相等,而`hashCode()`方法则应返回基于这两个属性计算出的哈希码,以确保当两个对象相等时,它们的哈希码也相同。 ```java import java.io.Serializable; ...

    hibernate的联合主键怎么设置

    由于联合主键类需要被用作哈希表中的键,因此必须重写 `hashCode()` 和 `equals()` 方法,确保当两个 `SCMapping` 实例具有相同的学号和课程号时,它们被视为相等。 3. **编写映射文件**: 使用 Hibernate 映射...

Global site tag (gtag.js) - Google Analytics