gpt4 book ai didi

java.lang.IllegalStateException : Transaction not active after REMOVE object, hibernate

转载 作者:行者123 更新时间:2023-11-30 07:41:13 25 4
gpt4 key购买 nike

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

错误是:

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();

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

但是如果我想删除项目,我会收到异常java.lang.IllegalStateException:事务未激活。

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();

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

编辑:我在谷歌上找到了一些代码并尝试了它:

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

这对我有用!

最佳答案

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

因此,在您的情况下,您正在对分离的对象调用 em.remove ,这会导致 IllegalStateException 并且您的 catch block 正在捕获它,但您没有打印它。您可能想在 catch block 中打印堆栈跟踪,这应该显示 IllegalStateException。

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

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

关于java.lang.IllegalStateException : Transaction not active after REMOVE object, hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34676335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com