final EntityManager em = EMF.TRANSACTIONS_OPTIONAL.createEntityManager();
try
{
// do query and return result here
return q.getSingleResult();
}
finally
{
em.close();
}
当我尝试使用一个方法查找所有对象列表然后另一个方法使用该列表来更新/删除对象时,我会得到有关对象detached
的错误的文件?
是否有更有效的方法来从我找不到的样板中包装逻辑?
答案 0 :(得分:2)
创建(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在JEE和非JEE应用程序中使用@Transactional注释和几行xml配置轻松完成此任务。
但是,无论您使用哪种方法,一旦关闭em(通过调用em.close()或基于某些配置/注释执行其工作的框架),您将获得分离的对象。
为了在某些em方法中处理分离的对象(比如用em.remove()删除),你需要将它们“合并”回上下文:
em.merge(myDetachedObject);
em.remove(myDetachedObject); // now it's attached so it can be removed
更新分离的对象很简单,因为简单的em.merge()已经这样做了(除了将对象合并到上下文中)。