【问题标题】:Spring with Hibernate JPA - EntityManager is closed exceptionSpring with Hibernate JPA - EntityManager 已关闭异常
【发布时间】:2016-06-17 07:17:05
【问题描述】:

每次我需要访问数据库时,我都使用EntityManagerFactory(injected) 创建 entityManager。我有以下抛出的代码,

org.springframework.dao.InvalidDataAccessApiUsageException: EntityManager is closed

entityManager = entityManagerFactory.createEntityManager();

List<Object> list = entityManager.createQuery("FROM Class").getResultList();

entityManager.close();

return list.toArray(new Object[list.size()]);

我正在创建一个 EntityManager,查询 db 以获得一些结果,关闭 EntityManager 并将结果返回给想要这些结果的人。 我想我可以弄清楚出了什么问题。 getResultList() 返回被管理的对象。因此,在关闭 EntityManager 后尝试访问它们会导致错误(嗯,我认为......)。我在关闭它之前尝试了entityManager.clear()。我得到了同样的错误。我试过分离 列表中的每个对象(entityManager.detach(obj)),然后关闭它。不过,我得到了同样的错误。我尝试在该方法上使用@Transactional(readOnly=true) 进行注释。没用。

我不会修改对象。我只需要它们显示在 UI 上。你能给我一个解决方案吗?我正在使用 Spring boot + hibernate JPA + AngularJS + Postgresql。

(PS:我无法打开 entityManager。让它打开,我收到超出连接限制的错误。这也不是最好的方法)

【问题讨论】:

  • 能否分享您的 ApplicationContext.xml 文件?
  • “列表”是什么类型的列表?一个 JPA 提供者?在这种情况下,请尝试将元素复制到您自己的 ArrayList 中。所有对象都应在 em.close 处分离,因此如果遇到异常,则使用其堆栈跟踪发布确切的异常;一些 Spring 异常不是真正的异常......它是嵌套的
  • @SanjeevSaha 我没有。我只有application.properities 文件
  • @NeilStockton 这是java.util.list。我试过你说的。堆栈跟踪太大了,无法粘贴到这里
  • 您是否尝试过简单地从事务边界内返回对象列表,然后在调用方法中使用它们?我还建议检查这个链接,看看你是否真的需要关闭 entityManager stackoverflow.com/questions/10762974/…

标签: java spring hibernate jpa spring-boot


【解决方案1】:

为什么不注入实体管理器而不是工厂?通过这种方式,您可以将创建和处置委托给框架,同时也消除了连接限制错误(因为框架将为您处理所有这些错误)。

你应该可以通过这种方式注入它:

@PersistenceContext
private EntityManager em;

那么你就可以使用它了。

【讨论】:

  • 之前我在 EntityManager 上尝试过@Autowired。它没有用。所以我使用了EntityManagerFactory。谢谢你的回答:)
【解决方案2】:

我也遇到过类似的问题,但仅使用@PersistenceContext 不起作用,我们需要设置 PersistenceContextType 也默认为 TRANSACTION,但在这种情况下,当多个线程尝试使用 EntityManager 的同一个单例实例时,我们需要像这样将其设置为 EXTENDED -

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;

它奏效了。 当我尝试在我的一个计划中执行数据库查询时遇到了这个问题。

参考 - https://www.baeldung.com/jpa-hibernate-persistence-context

【讨论】:

  • 我遇到了同样的问题。我不时使用调度程序做一些工作,现在它正在工作。你救了我的命。
猜你喜欢
  • 2011-01-04
  • 2018-10-19
  • 2015-08-19
  • 2016-04-11
  • 1970-01-01
  • 2023-04-10
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多