2014-03-29 55 views
3

假设我们有一个为他们每个人的两个实体依赖于彼此和DAO关于线程安全和JPA的EntityManager

Entity1 -> * Entity2 
Entity2 

现在,我们有两个线程是拉从数据库中的一些数据,线程1问Entity1Dao得到一些对象初始化了依赖字段,同时Thread2尝试使用Entity2Dao获得相同的Entity2对象(已经检索到)。

Entity1Dao创建EntityManager(em1)并检索数据,Entity2Dao将创建不同的EntityManager(em2)以从数据库中获取查询对象。

问题:在em1关闭之前em2是否锁定?如果不是,我们应该在“包含请求对象的其他entitymanager”上得到例外吗?

回答

4

否。每个EntityManager都会返回实体的不同实例。

然后并发事务可能会写入相同的行,最后一个将会获胜,除非实现乐观并发(通过向您的实体添加@Version字段)。

+0

感谢您的回答,您是否也可以回答这个问题。假设我有一些Object(附加)表单实体管理器,后来关闭了em,那个对象是否仍然连接? – vach

+0

不可以。如果关闭'em',那么'em'管理的所有对象都将不受管理。 –

+0

我试图为我的应用程序实现数据访问层,并且只有这样,我才发现使它成为线程安全的方法是使用entityManager每个事务,因此如您所说,从dao返回的任何对象都将变为非托管。有没有更好的方法来做到这一点? – vach