Jpa 如何管理实体对象以便删除它?

Jpa 如何管理实体对象以便删除它?,jpa,jpa-2.0,Jpa,Jpa 2.0,这不起作用——我总是会抛出IllegalArgumentException,并建议“尝试合并分离的,然后再次尝试删除” 输出日志显示以下内容: INFO: delete() entity not managed: com.database.SomeTable[ id=2 ] INFO: delete() this entity should now be managed: false 换句话说,merge()不会返回托管实体。谁能看出我做错了什么 第二个问题:是否有一种方法可以在一次交易而

这不起作用——我总是会抛出IllegalArgumentException,并建议“尝试合并分离的,然后再次尝试删除”

输出日志显示以下内容:

INFO: delete() entity not managed: com.database.SomeTable[ id=2 ]  
INFO: delete() this entity should now be managed: false
换句话说,merge()不会返回托管实体。谁能看出我做错了什么

第二个问题:是否有一种方法可以在一次交易而不是两次交易中实现这一点


这是GlassFish 3.1中的EclipseLink。

提交后,您的持久性上下文应该消失了。因此,提交后的println测试将失败,因为“target”对象不再受管理


在一个事务中完成所有工作,它应该会工作。您只需在“尝试”开始后启动事务。

提交后,您的持久性上下文应该消失。因此,提交后的println测试将失败,因为“target”对象不再受管理


在一个事务中完成所有工作,它应该会工作。您只需在“尝试”开始后启动事务即可。

这段代码创建了两个事务:

if (!em.contains(entity)) {
    System.out.println("delete() entity not managed: " + entity);
    utx.begin();
    target = em.merge(entity);
    utx.commit();
    System.out.print("delete() this entity should now be managed: " + em.contains(target));
}
utx.begin();
em.remove(target);
utx.commit();
虽然实体确实被合并到持久性上下文中,但它只适用于第一个事务,而不适用于两个事务。在第二个事务中,与该事务关联的持久性上下文将再次找到作为参数传递的分离对象,如下所示:

em.remove(target);
因为,前面的
utx.commit()
将分离对
target
的引用

要解决此问题,必须将实体合并到持久性上下文中,并在分离引用之前删除同一事务中的实体:

if (!em.contains(entity)) {
    System.out.println("delete() entity not managed: " + entity);
    utx.begin();
    target = em.merge(entity);
    em.remove(target);
    utx.commit();
    System.out.print("delete() this entity should now be deleted: " + (!em.contains(target)) );
}

这段代码创建了两个事务:

if (!em.contains(entity)) {
    System.out.println("delete() entity not managed: " + entity);
    utx.begin();
    target = em.merge(entity);
    utx.commit();
    System.out.print("delete() this entity should now be managed: " + em.contains(target));
}
utx.begin();
em.remove(target);
utx.commit();
虽然实体确实被合并到持久性上下文中,但它只适用于第一个事务,而不适用于两个事务。在第二个事务中,与该事务关联的持久性上下文将再次找到作为参数传递的分离对象,如下所示:

em.remove(target);
因为,前面的
utx.commit()
将分离对
target
的引用

要解决此问题,必须将实体合并到持久性上下文中,并在分离引用之前删除同一事务中的实体:

if (!em.contains(entity)) {
    System.out.println("delete() entity not managed: " + entity);
    utx.begin();
    target = em.merge(entity);
    em.remove(target);
    utx.commit();
    System.out.print("delete() this entity should now be deleted: " + (!em.contains(target)) );
}

你试过在事务中而不是在外部进行合并吗?你试过在事务中而不是在外部进行合并吗?好的,这很有效。我以为我以前试过,但没有。感谢您的帮助。如果使用“扩展”持久性上下文,原始合并将使对象处于管理状态。这很好。我以为我以前试过,但没有。感谢您的帮助。如果使用“扩展”持久性上下文,原始合并将使对象处于管理状态。