JPA - 关闭 EntityManagerFactory 引发异常
Posted
技术标签:
【中文标题】JPA - 关闭 EntityManagerFactory 引发异常【英文标题】:JPA - close EntityManagerFactory raises Exception 【发布时间】:2015-06-05 21:27:11 【问题描述】:我目前正在开发一个带有内存 derby 数据库的小型应用程序。我正在使用 Hibernate 4.3.10 和 JPA 2。这是我的小型演示应用程序的链接:http://1drv.ms/1KfCiHK
此短代码导致“java.sql.SQLException:无法在事务仍处于活动状态时关闭连接。”
EntityManagerFactory emf = Persistence.createEntityManagerFactory(null);
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> query = cb.createQuery(MyEntity.class);
em.createQuery(query.select(query.from(MyEntity.class))).getResultList();
em.close();
emf.close(); // Here the exception is raised!
所以,即使我不需要任何交易并且没有启动一项,也有什么事情启动了?!
如果我用这个替换三个查询行
em.createQuery("select m from MyEntity m", MyEntity.class).getResultList();
那么没有引发异常,尽管它正在做同样的事情!
是我做错了什么,还是这是我们想要的行为?
【问题讨论】:
我已经测试了您的示例,但 JPQL 和 CriteriaQuery 都出现错误“无法关闭连接,而事务仍处于活动状态”。 嗯,你是对的,我一定是盲人什么的......不过我的问题仍然存在:为什么会引发异常?我没有开始交易。em.getTransaction().isActive()
也返回 false。那么,我的错在哪里?还是 Hibernate/Derby 中的某个错误?
【参考方案1】:
你需要持久化单元的名字,名字在persistence.xml文件中。
EntityManagerFactory emf = Persistence.createEntityManagerFactory("name of the persistence unit");
【讨论】:
这没什么区别,只要你只有一个持久化单元。以上是关于JPA - 关闭 EntityManagerFactory 引发异常的主要内容,如果未能解决你的问题,请参考以下文章