0

我正在尝试删除一个实体,但是当我使用实体管理器时,我没有错误,但数据仍在数据库中,我正在使用全部级联,与此无关,我将其父引用删除为

Parent parent = child.getParent();
parent.getChildren().remove(child);
entityManager.remove(child);
entityManager.merge(parent);

有谁知道这样做的方法?

4

2 回答 2

0

根据克里斯的评论进行编辑,因为它确实根本不清楚。

第一,你必须明白一个实体实例可以有很多状态。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() 或者因为当你检索孩子时它被急切地加载了。)

于 2013-04-26T09:36:21.350 回答
0

这可能有几个原因:

您没有从子表中删除父引用 -child.setParent(null); 这很重要,因为父id表可能存储在子表中。

调用时尚未提交删除merge。这应该不是问题,但如果第一个想法没有帮助,我会尝试将删除和合并放在单独的事务中。

我假设您CascadeType.ALL仅在父级上使用。

于 2013-04-26T07:37:06.460 回答