java使用EntityManager有没有更有效的习惯用法?
我能找到的所有文档都显示了每个访问所需的习惯用法:
final EntityManager em = EMF.TRANSACTIONS_OPTIONAL.createEntityManager();
try
{
// do query and return result here
return q.getSingleResult();
}
finally
{
em.close();
}
当我尝试使用一个方法查找所有对象列表,然后另一个方法使用该列表更新/删除对象时,这会导致问题,我得到的对象错误是detached
有没有更有效的方法来总结我没有找到的样板文件中的逻辑
# 1 楼答案
创建(emf.createEntityManager())和关闭entityManager(em.close())实际上是一个样板文件,您应该将其委托给某个框架
对于JEE应用程序,您可以通过注释@PersistenceContext和@TransactionAttribute实现这一点:
Spring通过@Transactional注释和几行xml配置,在JEE和非JEE应用程序中都能轻松做到这一点
然而,无论使用哪种方法,一旦em被关闭(通过调用em.close()或通过一个基于一些配置/注释的框架执行其工作),就会得到分离的对象
为了在某些em方法中处理分离的对象(如使用em.remove()删除),需要将它们“合并”回上下文中:
更新分离的对象很容易,因为simple em.merge()已经做到了这一点(除了将对象合并到上下文中)