gpt4 book ai didi

java - 是否有更有效的使用 EntityManager 的习惯用法?

转载 作者:行者123 更新时间:2023-11-30 04:07:44 25 4
gpt4 key购买 nike

我能找到的所有文档都显示了每次访问所需的这个习惯用法:

final EntityManager em = EMF.TRANSACTIONS_OPTIONAL.createEntityManager();
try
{
// do query and return result here
return q.getSingleResult();
}
finally
{
em.close();
}

当我尝试使用一种方法查找所有对象列表,然后另一种方法使用该列表更新/删除对象时,这会导致问题我收到有关对象被分离的错误?

有没有更有效的方法来包装我没有找到的样板中的逻辑?

最佳答案

创建(emf.createEntityManager())和关闭entityManager(em.close())确实是一个样板文件,您应该将其委托(delegate)给某个框架。

对于 JEE 应用程序,您可以使用注释 @PersistenceContext 和 @TransactionAttribute 来实现此目的:

@PersistenceContext(unitName = "my-unit")
private EntityManager entityManager;

@TransactionAttribute
public void myMethod(Item item) {
// do em.find(), em.createQuery(), query.getResultList(), etc.
// no need to init em nor close it
}

Spring 通过其 @Transactional 注释和几行 xml 配置在 JEE 和非 JEE 应用程序中轻松完成此操作。

但是,无论您使用哪种方法,一旦 em 关闭(通过调用 em.close() 或框架基于某些配置/注释完成其工作),您将获得分离的对象。

为了在某些 em 方法中使用分离的对象(例如使用 em.remove() 删除),您需要将它们“合并”回上下文中:

em.merge(myDetachedObject);
em.remove(myDetachedObject); // now it's attached so it can be removed

更新分离的对象很容易,因为简单的 em.merge() 就已经做到了这一点(除了将对象合并到上下文之外)。

关于java - 是否有更有效的使用 EntityManager 的习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20368169/

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