Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Hibernate JPA的Spring-EntityManager关闭异常_Java_Spring_Hibernate_Jpa_Spring Boot - Fatal编程技术网

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
。谢谢你的回答:)我也面临同样的问题。我正在使用一个调度程序不时地做一些工作,现在它正在工作。你救了我的命,我也面临同样的问题。我正在使用一个调度程序不时地做一些工作,现在它正在工作。你救了我的命。