【发布时间】: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