何时需要overload掉equels()和hashcode();

no eq/hC at all       eq/hC with the id property        eq/hC with  buisness key
use in a composite-id  No              Yes           Yes
multiple new instances in set     Yes     No      Yes
equal to same object from other session  No  Yes  Yes
collections intact after saving  Yes  No  Yes

首先解释一下,no eq/hc at all指的是不是全部需要后面的两种情况。
第一种情况:如果在我们的pojo当中涉及到有联合主键的操作时,那么不但需要id,还要业务键作为equels的判断值。
第二种情况:如果在我们的系统中涉及到。在一个新的set中,添加多个新的对象,然后save的时候。如:
HashSet someSet = new HashSet();
someSet.add(new PersistentClass());
someSet.add(new PersistentClass());
assert(someSet.size() == 2);
当hibernate。save的时候,第一个会持久化到数据库,此时第一个已经是一个po了,他和第二个不是同一个对象,因为此时第二个还是一个vo对象。这种情况是采用主键的方式,是可以插入到数据库当中,但是通常情况之下,我们是不允许具有相同名字的人存到数据库中。这样又如何处理呢?就是为了避免业务键上具有相同的值,该如何处理呢?就是,让业务主键参与。主键可以不参与equeas。
第三种情况:当我们的系统涉及到一个相同的一个纪录,会在不同的session中操作的时候。如:
PersistentClass p1 = sessionOne.load(PersistentClass.class, new Integer(1));
PersistentClass p2 = sessionTwo.load(PersistentClass.class, new Integer(1));
assert(p1.equals(p2));
那末不但要让主键参与,还要让业务键参与equals。
第四种情况:当我们的系统中涉及到,不使用set集合持久化数据的时候。如:
HashSet set = new HashSet();
User u = new User();
set.add(u);
session.save(u);
assert(set.contains(u));
就可以只让业务键参与equeals。

你可能感兴趣的:(Hibernate)