播放框架:EntityManager 已关闭

Posted

技术标签:

【中文标题】播放框架:EntityManager 已关闭【英文标题】:Play Framework: EntityManager is closed 【发布时间】:2016-11-01 14:43:38 【问题描述】:

我有一个从数据库读取数据的端点。结果,我有两个 DAO 类:DAO1 和 DAO2。 在 DAO1 我有这样的东西:

public MYDO1 get(Long id) 
    return em.find(MyDO1.class, id);

在 DAO2 中我有这样的东西:

public List<MyDO2> getSomething(Long idFromDO1) 
   CriteriaQuery<MyDO2> criteriaQuery= criteriaBuilder.createQuery(MyDO2.class);
   Root<MyDO2> root = criteriaQuery.from(MyDO2.class);
   criteriaQuery.select(root);
   Predicate p1 ...
   Predicate p2 ...

   criteriaQuery.where(myPredicates);

   Query query = em.createQuery(criteriaQuery);
   return query.getResultsList();

现在,在我的服务类中,我调用了两个 DAO。在第一次通话时,一切正常。然而,在第二次通话中,我收到了这个错误:java.lang.IllegalStateException: EntityManager is closed

奇怪的是,我还有一个端点,用于检索调用相同 DAO 的 MyDO1 条目并且它可以工作。

【问题讨论】:

【参考方案1】:

不起作用的服务类有@Singleton。删除它解决了问题。

【讨论】:

我真的不明白一个设计合理的单例类会如何导致一个封闭的实体管理器被重用。我不会这么快就解决这个问题,因为现在你让问题消失了。

以上是关于播放框架:EntityManager 已关闭的主要内容,如果未能解决你的问题,请参考以下文章

Shopware 客户导入错误:EntityManager 已关闭

EntityManager 已关闭?

我必须关闭()每个 EntityManager 吗?

JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序

使用休眠 sessionFactory 或 JPA entityManager?

我们是不是需要在选择调用时关闭 EntityManager 资源