有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA无法删除具有onotomany关系和cascatype all的实体

我试图删除一个实体,但当我使用实体管理器时,我没有错误,但te数据仍在数据库中,我使用的是cascade all,独立于此,我删除其父引用作为

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

有人知道怎么做吗


共 (2) 个答案

  1. # 1 楼答案

    这可能有几个原因:

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

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

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

  2. # 2 楼答案

    根据Chris的评论进行编辑,因为它确实一点也不清楚

    首先,你必须理解实体实例可以有很多状态http://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_em_lifecycle.html

    “合并”用于将实体附加到当前entityManager。一旦它被管理,当EntityManager被刷新时,您对该实体所做的所有修改都将被持久化到数据库中。这通常发生在当前事务结束时(或者当您手动调用flush时,或者当entityManager估计有必要时)

    如果您的实体已从当前事务中的数据库中检索到,则不需要调用merge,因为它们已被管理

    假设这样

    你只需要打个电话

    entityManager.remove(child);
    

    或者

    parent.getChildren().remove(child);
    

    如果已在关系上配置孤立删除(在父级中)

    因此,在刷新当前事务时,而不是在方法调用时,这将自动刷新到数据库

    否则,您可以使用entityManager.flush()强制刷新,但这是一种糟糕的做法。无论如何,在提交/关闭事务之前,您不会在数据库中看到更改

    如果您想使用entityManager.remove(child)删除一个子实体,则必须确保在父实体上应用相关修改(使用parent.getChildren().remove(child)而不是entityManager.refresh(parent)),前提是您的父实例当前处于管理状态(这意味着它实际上在内存中存在一个父实例,因为您检索了它,或者调用了child.getParent(),或者因为它是当你找回孩子的时候,他急切地装填着。)