gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:31 28 4
gpt4 key购买 nike

我正在使用 ThreadLocal 和请求/实体模式来获取实体。这种情况发生时,我关闭了一个实体管理器,并且在后台有一些实体可以编辑、复制和修改,然后我想将其保留或与新的实体管理器合并。我不知道这是一个合法或正确的解决方案!

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

我以 RESOURCE_LOCAL 方式管理实体。

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

最佳答案

当您关闭 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 field 。每次修改实体时,其版本都会发生变化。如果您尝试合并分离的实体,并且从数据库检索到的当前版本具有不同的版本,则会抛出 OptimisticLockException

关于java - 当关闭相关(相同)entityManager 时,entityManager 先前找到或获取的实体怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21290807/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com