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 引发异常的主要内容,如果未能解决你的问题,请参考以下文章

从 JDBC 迁移到 JPA [关闭]

JPA 最佳实践? [关闭]

JPA 实现——哪一个最好用? [关闭]

JPA - 关闭 EntityManagerFactory 引发异常

Spring + Hibernate + JPA [关闭]

Java AppEngine:JDO还是JPA,如何选择? [关闭]