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