Java 带Hibernate JPA的Spring-EntityManager关闭异常
每次需要访问数据库时,我都使用Java 带Hibernate JPA的Spring-EntityManager关闭异常,java,spring,hibernate,jpa,spring-boot,Java,Spring,Hibernate,Jpa,Spring Boot,每次需要访问数据库时,我都使用entityManager工厂(注入)创建entityManager。我有下面的代码抛出 org.springframework.dao.InvalidDataAccessApiUsageException:EntityManager已关闭 entityManager = entityManagerFactory.createEntityManager(); List<Object> list = entityManager.createQuery("
entityManager工厂(注入)
创建entityManager。我有下面的代码抛出
org.springframework.dao.InvalidDataAccessApiUsageException:EntityManager已关闭
entityManager = entityManagerFactory.createEntityManager();
List<Object> list = entityManager.createQuery("FROM Class").getResultList();
entityManager.close();
return list.toArray(new Object[list.size()]);
entityManager=entityManagerFactory.createEntityManager();
List List=entityManager.createQuery(“来自类”).getResultList();
entityManager.close();
返回list.toArray(新对象[list.size()]);
我正在创建一个EntityManager,查询数据库中的一些结果,关闭EntityManager,并将结果返回给想要这些结果的人。
我想我能找出问题所在。getResultList()
返回被管理的对象。因此,在关闭导致错误的EntityManager
后尝试访问它们(嗯,我想…)。在关闭它之前,我尝试了entityManager.clear()
。我也犯了同样的错误。我试着分开
关闭列表中的每个对象(entityManager.detach(obj)
)之前。不过,我还是犯了同样的错误。我尝试在方法上使用@Transactional(readOnly=true)
进行注释。没用
我不打算修改对象。我只需要它们显示在UI上。你能给我一个解决办法吗?我使用的是SpringBoot+HibernateJPA+AngularJS+Postgresql
(PS:我不能让entityManager保持打开状态。如果让它保持打开状态,则连接限制超出错误。这也不是最好的方法)为什么不注入实体管理器而不是工厂?通过这种方式,您可以将创建和处理委托给框架,同时还可以消除连接限制错误(因为框架将为您处理所有这些) 您应该能够通过以下方式将其注入:
@PersistenceContext
private EntityManager em;
然后您可以直接使用它。为什么不注入实体管理器而不是工厂?通过这种方式,您可以将创建和处理委托给框架,同时还可以消除连接限制错误(因为框架将为您处理所有这些) 您应该能够通过以下方式将其注入:
@PersistenceContext
private EntityManager em;
然后你可以直接使用它。今天,我也遇到了类似的问题,但仅仅使用@PersistenceContext是不起作用的,我们需要设置PersistenceContextType,这也是默认的事务,但在这种情况下,当多个线程尝试使用EntityManager的同一个单例实例时,我们需要像这样将其设置为EXTENDED-
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
它成功了。
当我试图在我的一个调度程序中执行db查询时,我遇到了这个问题
参考-今天,我也遇到了类似的问题,但仅仅使用@PersistenceContext并不起作用,我们需要设置PersistenceContextType,这也是默认事务,但在这种情况下,当多个线程尝试使用EntityManager的同一个单实例时,我们需要将其设置为如下扩展-
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
它成功了。
当我试图在我的一个调度程序中执行db查询时,我遇到了这个问题
参考-您能否共享您的ApplicationContext.xml文件?什么类型的列表是“列表”?JPA提供商之一?在这种情况下,请尝试将元素复制到您自己的ArrayList中。所有对象都应该在em.close时分离,因此如果获得异常,则使用堆栈跟踪发布确切的异常;有些Spring异常不是真正的异常。。。它的nested@SanjeevSaha我没有。我只有
应用程序。属性file@NeilStockton它是java.util.list
。我试过你说的了。堆栈跟踪太大,无法粘贴到这里。您是否尝试过简单地从事务边界内返回对象列表,然后在调用方法中使用它们?我还建议您检查此链接,看看您是否真的需要关闭entityManager。您可以共享您的ApplicationContext.xml文件吗?什么类型的列表是“列表”?JPA提供商之一?在这种情况下,请尝试将元素复制到您自己的ArrayList中。所有对象都应该在em.close时分离,因此如果获得异常,则使用堆栈跟踪发布确切的异常;有些Spring异常不是真正的异常。。。它的nested@SanjeevSaha我没有。我只有应用程序。属性file@NeilStockton它是java.util.list
。我试过你说的了。堆栈跟踪太大,无法粘贴到这里。您是否尝试过简单地从事务边界内返回对象列表,然后在调用方法中使用它们?我还建议检查此链接,看看您是否真的需要关闭entityManager。之前我在entityManager上尝试了@Autowired
。它不起作用。所以我使用了EntityManagerFactory
。感谢您的回答:)早些时候,我在EntityManager上尝试了@Autowired
。它不起作用。所以我使用了EntityManagerFactory
。谢谢你的回答:)我也面临同样的问题。我正在使用一个调度程序不时地做一些工作,现在它正在工作。你救了我的命,我也面临同样的问题。我正在使用一个调度程序不时地做一些工作,现在它正在工作。你救了我的命。