带有Hibernate JPA的Spring - EntityManager是关闭异常

时间:2016-06-17 07:17:05

标签: java spring hibernate jpa spring-boot

每次我需要访问数据库时,我都使用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打开。把它打开,我的连接限制超出了错误。这也不是最好的方法)

2 个答案:

答案 0 :(得分:5)

为什么不注入实体经理而不是工厂?这样你可以将创建和处理委托给框架,gettind也可以摆脱连接限制错误(因为框架会为你处理所有这些)。

你应该能够这样注射:

@PersistenceContext
private EntityManager em;

然后你可以使用它。

答案 1 :(得分:0)

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

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

成功了。 当我尝试在我的时间表之一中执行数据库查询时,遇到了这个问题。

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