从数据库中删除对象后出现错误。
错误是:
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();
它对我有用!
答案 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> {
}