当关闭相关(相同)的entityManager时,实体管理器先前找到或获取的实体怎么样?

时间:2014-01-22 18:18:00

标签: java jpa eclipselink entitymanager

我正在使用ThreadLocal和请求/实体模式来获取实体。这种方式发生我关闭一个entityManager并在后台有实体编辑,复制,所以修改,然后我想坚持或合并它与新的entityManager。我不知道这是一个合法或正确的解决方案!

我没有找到关于此的文章,问题和答案。也许我的意识太强了,但是想知道是否存在一些已知的问题,或者以这种方式关闭entityManager时出现的问题...(我想也许相关的实体在归零后关闭它可能会分离)

我管理entures RESOURCE_LOCAL方式。

或者?如果我感觉良好:entityManager只是持久化上下文的桥梁/路径,而entityManagers可以替换,在托管的entite和entityManager之间没有真正的或严格的联系(在这个意义上)......

1 个答案:

答案 0 :(得分:1)

当您关闭EntityManager时,其所有托管实体都将变为分离。没有什么不妥。您仍然可以将分离的实体作为java对象使用,但更改它们的属性不会影响数据库(除非您重新附加它)。此外,一旦实体被分离,您就不能再遵循在实体仍然附加时尚未初始化的延迟加载关系。

稍后您可以通过调用其上的merge()方法将分离的实体重新附加到其他EntityManager。例如:

// Here myEntity is managed by entityManager1.
SomeEntity myEntity = entityManager1.find(SomeEntity.class, id);

// myEntity becomes detached.
entityManager1.close();

// I can still work with the java object.
myEntity.setSomeProperty("blah");

// Here myEntity becomes managed by entityManager2.
// It basically retrieves the current entity from the DB (based on its ID),
// then apply any change that was made to it while it was detached.
myEntity = entityManager2.merge(myEntity);

// If you commit at this point, the changes made to myEntity while
// it was detached will be persisted to the DB.

为了防止在分离实体时(例如,另一个应用程序修改相应的行)在数据库中“背后”进行更改的情况,您可以使用@Version字段。每次修改实体时,其版本都会更改。如果您尝试合并分离的实体并且从数据库检索的当前版本具有不同的版本,则会抛出OptimisticLockException