我正在尝试删除一个实体,但是当我使用实体管理器时,我没有错误,但数据仍在数据库中,我正在使用全部级联,与此无关,我将其父引用删除为
Parent parent = child.getParent();
parent.getChildren().remove(child);
entityManager.remove(child);
entityManager.merge(parent);
有谁知道这样做的方法?
我正在尝试删除一个实体,但是当我使用实体管理器时,我没有错误,但数据仍在数据库中,我正在使用全部级联,与此无关,我将其父引用删除为
Parent parent = child.getParent();
parent.getChildren().remove(child);
entityManager.remove(child);
entityManager.merge(parent);
有谁知道这样做的方法?
根据克里斯的评论进行编辑,因为它确实根本不清楚。
第一,你必须明白一个实体实例可以有很多状态。http://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_em_lifecycle.html
Merge 在这里将一个实体附加到当前的 entityManager。一旦它被管理,当 EntityManager 被刷新时,您将对实体进行的所有修改都将保存在数据库中。这通常发生在当前事务结束时(或者当您手动调用 flush 或 entityManager 估计有必要时)。
如果您的实体已从当前事务中的数据库中检索到,则无需调用合并,因为它们已被管理。
假设这个
你只需要打电话
entityManager.remove(child);
或者
parent.getChildren().remove(child);
如果您已在关系上配置了孤立删除(在父级中)。
当当前事务将被刷新而不是在方法调用时,这将自动刷新到数据库中。
否则,您可以通过使用强制冲洗,entityManager.flush()
但这是一种不好的做法。无论如何,在事务提交/关闭之前,您不会看到数据库中的更改。
如果你想删除一个孩子 usingentityManager.remove(child)
你必须确保对父实体应用相关的修改( usingparent.getChildren().remove(child)
和 not entityManager.refresh(parent)
)如果你的父实例当前是托管的(意味着它实际上存在你的父实例在内存中,因为你已经检索了它或因为你调用了 child.getParent() 或者因为当你检索孩子时它被急切地加载了。)
这可能有几个原因:
您没有从子表中删除父引用 -child.setParent(null);
这很重要,因为父id
表可能存储在子表中。
调用时尚未提交删除merge
。这应该不是问题,但如果第一个想法没有帮助,我会尝试将删除和合并放在单独的事务中。
我假设您CascadeType.ALL
仅在父级上使用。