在我们的web应用中使用hibernate作为持久化层的orm框架时候,难免会遇到在两个不同的session中并发访问同一个持久化状态的对象,但是,一个持久化的实例是不可能在两个session*享的,因此这种情况下有两种不同的标识语义:
1、数据库的标识:a.id.equals(b.id)
2、jvm的标识:a==b
对于那些关联到特定的session上的对象来说,这两种标识是等价的,这种情况下与数据库标识对应的jvm是由hibernate来保证的。
不过在两个不同的session中访问同一个持久化对象,这个持久化对象的两个实例在jvm来看是不一样的。这种情况下可以使用同步和提交的时候使用自动版本化和乐观锁定方法来解决。
由于在单个线程内,操作单元中的对象识别不需要代价昂贵的锁定和其他的同步,因此它具有最好的伸缩性,只要在单个线程只持有一个session,应用程序就不需要同步任何业务对象。
在session的范围内,可以放心的使用==进行对象的比较,但是在session的范围之外==比较会出现无法预期的结果。例如:如果把两个托管对象实例放进同一个set就可能发生,这两个对象可能拥有一样的数据库标识,但是hibernate无法保证他们的jvm标识一致。所以开发人员必须要覆盖持久化类equals和hashcode方法hashcode
本文出自 “想要跨越,就要付出更多” 博客,请务必保留此出处http://andywuchuanlong.blog.51cto.com/4898493/1393077