关于hibernate中实体中equals和hashcode方法的重写

来源:互联网 发布:有没有在美迪学淘宝的 编辑:程序博客网 时间:2024/06/08 03:16
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只是技术要求(为了提高效率) 

2,为什么要重写equals呢,因为在java的集合框架中,是通过equals来判断两个对象是否相等的 

3,在hibernate中,经常使用set集合来保存相关对象,而set集合是不允许重复的,但是下面的程序,你判断一下运行结果 

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运算是否相等 
   如果不相等,认为两个对象也不相等 
   如果相等,认为两个对象相等 
完毕 
原创粉丝点击