java.lang.IllegalStateException:在REMOVE对象HIBERNATE之后,事务处于非活动状态

时间:2016-01-08 11:44:18

标签: java hibernate

从数据库中删除对象后出现错误。

错误是:

java.lang.IllegalStateException: Transaction not active
    org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:70)

我有简单的应用程序。我在启动时创建了EntityManagerFactory

每次如果我想使用数据库,我都会创建EntityManager,下班后我会这样关闭它:

启动:

EntityManagerFactory emf = ....;
.
.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
      em.persist(OBJECT TO SAVE); //REALLY NEW OBJECT
} catch (Exception e) {
    em.getTransaction().rollback();
}
em.getTransaction().commit();
em.close();

所以,没关系,我可以将一些对象保存到db。

但是如果我要删除项目,我会收到例外java.lang.IllegalStateException: Transaction not active.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
      em.remove(OBJECT TO REMOVE); //REALLY EXIST IN DB
} catch (Exception e) {
    em.getTransaction().rollback();
}
em.getTransaction().commit();
em.close();

你能帮我解决这个问题吗?我不知道它是什么......

编辑:我在google上找到了一些代码,我试了一下:

em.getTransaction().begin();
em.remove(em.merge(OBJECT TO REMOVE));
em.getTransaction().commit();

它对我有用!

2 个答案:

答案 0 :(得分:1)

Per Javadocs,entityManager.remove仅适用于托管实体,如果在分离的实体上调用,则会导致IllegalStateException。

因此,在您的情况下,您在一个被捕获的对象上调用em.remove并导致IllegalStateException并且您的catch块正在捕获它,但您没有打印它。您可能希望在catch块中打印stacktrace,这应该显示IllegalStateException。

最后,在捕获异常后,您仍然继续进行回滚事务的提交,这导致您看到异常。

em.remove(em.merge(object))工作的原因现在应该清楚了。 em.merge导致从数据库中获取对象,因此它成为一个托管实体,并在托管实体上调用remove方法导致成功删除它。

答案 1 :(得分:0)

您可以尝试通过保存删除方法使用存储库进行交易。这是一种更安全的方法。

@ApplicationScoped
@Repository
public abstract class MyEntityRepository implements EntityRepository<MyEntity, Long>, EntityManagerDelegate<MyEntity> {

}