`
yushan
  • 浏览: 147032 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Hibernate为什么要重写equals和hashCode方法

阅读更多

ZJ 21:00:06
对了 老师,为什么在HIBERNA里要重写HASCODE 和EQUALS这两个方法?
付老实 21:04:22
equals用来按照自己的规则判断两个对象是否相等,而重写了equals后,按照java的惯例,就需要重写hashCode
ZJ 21:05:11
老师 只看懂的一点点呀,再稍微说多点啊!
付老实 21:08:04
这么说罢
付老实 21:08:23
1,重点是equals,重写hashCode只是技术要求(为了提高效率)
付老实 21:09:02
2,为什么要重写equals呢,因为在java的集合框架中,是通过equals来判断两个对象是否相等的
付老实 21:10:03
3,在hibernate中,经常使用set集合来保存相关对象,而set集合是不允许重复的,但是下面的程序,你判断一下运行结果
付老实 21:10:44
Set user = new HashSet();
user.add(new Book("精通struts"));
user.add(new Book("精通struts"));
System.out.println(user.size());
Neo 21:10:48
这两个为什么相同阿???
就是说set集合是按照equals来判断是否重复的?
付老实 21:12:00
恩,猜一下打印的结果
ZJ 21:11:31
应该输出1吧,或许报错 呵呵
付老实 21:12:44
错了
付老实 21:12:58
完全取决于Book类有没有重写equals方法
付老实 21:13:39
如果没有重写,默认equals是比较地址,那么这两个book对象不一样,输出2,意味着hibernate会认为这是两个对象,再接下来的持久化过程中可能会出错
付老实 21:14:07
如果重写了equals,比如按照主键(书名)比较,那么这两个对象是一样的,输出1
付老实 21:14:10
明白了?
ZJ 21:13:26
明白了
付老实 21:14:32
再说hashCode
ZJ 21:13:51

付老实 21:14:57
equals方法虽好,但是效率相对底下    
ZJ 21:14:43
老实接着说说    
付老实 21:15:45
典型的equals实现
public boolean equals(Object obj) {
       Book b = (Book)obj;
       return this.name.equals(b.name);
}
付老实 21:16:43
其间需要向下转型,调用其他类的equals等操作,有可能比较费时,特别是比较规则比较复杂的时候
ZJ 21:16:33
恩 能理解
付老实 21:18:04
而hashCode为每一个对象生成一个散列码(通过一种神秘的算法,一般为关键属性乘以一个质数),避免了比较慢的运算
付老实 21:18:27
但是hashCode并不能保证能为每一个不同的对象生成唯一的散列码
ZJ 21:18:34
那若是散列码重复了呢?
付老实 21:19:59
所以在java的集合中,判断两个对象是否相等的规则是:
1,判断两个对象的hashCode是否相等
      如果不相等,认为两个对象也不相等,完毕
      如果相等,转入2
2,判断两个对象用equals运算是否相等
      如果不相等,认为两个对象也不相等
      如果相等,认为两个对象相等

完毕

Neo 21:19:52
String好像是一个特例阿。。。
付老实 21:20:59
由此可以看出,一个好的散列码算法可以加快程序的速度,apache专门有个工具可以为类生成hashCode,MyEclipse 5.0中也有一个工具
付老实 21:21:09
String没有什么特殊的,也是这个原则
Neo 21:21:39
那"123","123"这两个字符串为什么相等?
付老实 21:23:00
晕,你说呢
Neo 21:22:07
。。。
Neo 21:22:10
想起来了
Neo 21:22:19
池是把?
付老实 21:23:20

Neo 21:22:36
云,忘了~
付老实 21:23:49
好了,下去再去看看《深入浅出Hibernate》的210页吧

本文转至:http://hi.baidu.com/fgfd0/blog/item/99569f136da496856438db43.html

 

ps:Esclisp自动生成equals/hashCode工具  Commonclipse (http://commonclipse.sf.net)

分享到:
评论

相关推荐

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

    2. **重写equals和hashCode方法**:这两个方法对于判断实体对象是否相等以及在集合中存储实体至关重要。在使用复合主键的情况下,通常会基于所有构成主键的属性来重写这些方法。 针对`Person`类的实现,我们可以...

    Hibernate注解映射联合主键

    在这种映射方式中,联合主键的字段被放在一个单独的类中,这个类需要实现`java.io.Serializable`接口并重写`equals()`和`hashCode()`方法,以确保对象的唯一性。然后,这个类被注解为`@Embeddable`。在主类中,我们...

    Hibernate电子书(全)

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

    Hibernate5用户手册中文版

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

    《深入浅出Hibernate》读书笔记

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

    hibernate学习笔记

    2. 联合主键需要重写equals和hashCode方法,实现Serializable接口。 七、Hibernate核心接口 1. `Configuration`接口: - 提供了管理配置信息的方法,用于创建`SessionFactory`。 - 主要方法`buildSessionFactory...

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

    此外,为了确保两个`UserRolePK`对象是否相等,我们需要重写`equals()`和`hashCode()`方法。这里,`equals()`方法主要比较`userId`和`roleId`的值是否相等,而`hashCode()`方法则应返回基于这两个属性计算出的哈希码...

    Hibernate Reference

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

    hibernate的联合主键怎么设置

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

    Hibernate4

    - 必要时,还需要重写 `equals` 和 `hashCode` 方法以支持某些特定操作。 3. **创建对象-关系映射文件**: - 映射文件采用 XML 格式,用于指定 Java 类和数据库表之间的映射关系。 - 包括类-表映射、属性-字段...

    hibernate 3.2中文手册 中文文档

    - **4.3 实现`equals()`和`hashCode()`** - 讲解为何持久化类应该重写这两个方法,以及如何正确实现它们。 - **4.4 动态模型(Dynamicmodels)** - 介绍如何使用Hibernate的动态模型功能来处理不确定的数据结构。 ...

    用Hibernate实现领域对象的自定义字段

    这个接口要求我们重写一些关键方法,如`nullSafeGet()`、`nullSafeSet()`、`equals()`、`hashCode()`等,以便Hibernate知道如何从数据库中读取和写入这些字段。 ```java public class DateRangeType implements ...

    hibernate3.1.2英文文档(pdf)

    - **equals() 和 hashCode() 方法**:为确保实体对象的正确比较,需重写这两个方法。 - **动态模型**:支持运行时动态创建实体类。 - **Tuplizers**:自定义数据类型转换器,用于处理复杂数据结构。 #### 基本对象...

    Hibernate中文API大全

    元素允许你映射一个组件类作为一个Map的key,前提是你必须正确的在这个类中重写了hashCode() 和 equals()方法。 8.4. 组件作为联合标识符(Components as composite identifiers) 你可以使用一个组件作为一个实体类...

    hibernate笔记

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

    尚硅谷佟刚 Hibernate1

    此外,如果需要使用到Set或其他集合,还需要重写`equals()`和`hashCode()`方法。 3. **创建对象-关系映射文件**:每个持久化类对应一个`.hbm.xml`文件,该文件定义了类与数据库表之间的映射规则,包括字段映射、...

    hibernate

    - **equals() 和 hashCode() 方法**:重写这两个方法以支持基于标识符的等价判断。 - **动态模型**:支持运行时动态创建和更新的模型。 - **Tuplizers**:使用自定义 Tuplizer 控制对象如何从结果集中加载。 #### ...

Global site tag (gtag.js) - Google Analytics