Hibernate的持久化类中什么时候需要重写hashcode()和equals()方法

源文地址:http://hi.baidu.com/xforluxx/blog/item/1412910940e26b80d1581bee.html


equals用来按照自己的规则判断两个对象是否相等,而重写了equals后,按照java的惯例,就需要重写hashCode 。重点是equals,重写hashCode只是技术要求(为了提高效率) 。

为什么要重写equals呢?
因为在java的集合框架中,是通过equals来判断两个对象是否相等的 。如果没有重写,默认equals是比较地址

而hashCode为每一个对象生成一个散列码(通过一种神秘的算法,一般为关键属性乘以一个质数),避免了比较慢的运算。但是hashCode并不能保证能为每一个不同的对象生成唯一的散列码。需要再加上equals方法去判断。
所以在java的集合中,判断两个对象是否相等的规则是:
1,判断两个对象的hashCode是否相等
     如果不相等,认为两个对象也不相等,完毕
     如果相等,转入2
2,判断两个对象用equals运算是否相等
     如果不相等,认为两个对象也不相等
     如果相等,认为两个对象相等


示例:
Set user = new HashSet();
user.add(new Book("精通struts"));
user.add(new Book("精通struts"));
System.out.println(user.size()); 


如果没有重写,那么这两个book对象不一样,输出2,
意味着hibernate会认为这是两个对象,再接下来的持久化过程中可能会出错
如果重写了equals,比如按照主键(书名)比较,那么这两个对象是一样的,输出1。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值