有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用EntityManager有没有更有效的习惯用法?

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

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

当我尝试使用一个方法查找所有对象列表,然后另一个方法使用该列表更新/删除对象时,这会导致问题,我得到的对象错误是detached

有没有更有效的方法来总结我没有找到的样板文件中的逻辑


共 (1) 个答案

  1. # 1 楼答案

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

    对于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
    

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