为什么要重载equals()和hashCode() ?
考虑这样的场景:有二个session,而这两个session都同时load了数据库了同一行数据,所以这两个load出来的object就具有想同的identity,假设他们分别为book1、book2 ,他们分别与不同的session关联,出于某种原因,这两个object都脱离了session成为了detached object,当出现这样的操作的时候:
Set set = new HashSet();
set.add(book1);
//set.add(book2);
student.setBooks(set);
seession.save(student); //其中student和book是一对多的关系,先在想增加一个student ,这student关联了数据库已经存在的纪录book1
这样运行OK!
现在去掉//set.add(book2);的注释,再次执行则会出现如下异常:
net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 40288189ff52e8b100ff52e8b5fb0002, of class: com.test.Book
显然session关联的object也是唯一的,和数据库里的行纪录一一对应。
所以为了避免上面的问题出先,尤其是在进行collecion操作的时候,最好重载equals()和hashCode()方法,这样set再equals object的时候可以按照我们自己定义的方式来equals,比如比较value (默认情况是比较 object identity),这样就可以避免set里出现相同的object(比如避免两个具有想同value的object出现,当然主要还是看自己是如何定义equals()的),另外equals()和hashCode()方法是完全一致的,当往set集合添加object的时候,set会同时比较object的是否equals,以及object的hashCode是否相同,必须两个都返回true,则set才不会继续添加相同的object,因为set里已经存在了相同了object,这样也就可以避免了在与session关联的时候会出现上面的异常。 所以重载的时候必须equals()和hashCode()必须同时重载。
没有评论:
发表评论