当前位置: 首页 > 知识库问答 >
问题:

在@OneTomany之前删除子级而不更新子级

司空通
2023-03-14
public Class Race {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="race", orphanRemoval = true)
    private List<Lap> laps = new ArrayList<>(0);
    ...
}

public Class Lap {
   @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.REFRESH)
   @JoinColumn(name = "RACE_ID", nullable = false)
    private Race race;

   @OneToOne(mappedBy = "nextLap", fetch = FetchType.LAZY)
   private Lap previousLap;

   @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
   @JoinColumn(name = "NEXT_ID")
   private Lap nextLap;
 ...
}
txn = session.getTransaction();
txn.begin();
race = session.merge(race);
session.remove(race);
session.flush(); //=>Exception here
txn.commit();

注意:如果我只有一个孩子,我可以删除它,没有任何例外,如果我有2个或更多的孩子,我有一个例外。

谢谢你的帮助!

共有1个答案

锺离边浩
2023-03-14

对于将实体作为级联删除,最好的方法是通过几个查询来删除它们。

例如:

em.createQuery("delete from Lap p where p.race.id = :id).setParameter("id", id).executeUpdate();

em.createQuery("delete from Race r where r.id = :id).setParameter("id", id).executeUpdate();

https://thorben-janssen.com/avid-cascadetype-delete-many-assocations/阅读此处以获得更好的理解。

 类似资料:
  • 问题内容: 我对父实体和子实体之间的简单映射有疑问。一切正常,只有当我从集合中删除子记录时,才会删除它们。 父母: 孩子: 如果我现在从childs集合中删除and child,它不会从数据库中删除。我尝试取消引用,但这也不起作用。 实体在Web应用程序中使用,删除是Ajax请求的一部分。按下保存按钮时,我没有已删除子项的列表,因此我无法隐式删除它们。 问题答案: JPA的行为是正确的( 按照规范

  • 问题内容: 我有以下实体: 球队 } 和 USER_TEAM_ROLE 现在,当使用{UTR1,UTR3}更新包含例如Team.userTeamRoles = {UTR1,UTR2}的Team实体时,我希望删除UTR2。但是我现在的方法是,旧列表保持不变,并且只将UTR3添加到列表中。 这是我目前的做法: 我认为通过执行该列表将被重置,并且由于级联,先前的列表将被删除。 任何帮助表示赞赏。谢谢 问

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 我已经创建了纸张和Mcq问题之间的映射如下。 } 当我更新纸质实体时,它会删除所有MCQ。 SQL输出:

  • 我有两个实体使用Spring和Hibernate

  • 我的实体更新有问题。如你所见,我有三个实体。 包含类中的列表。 包含类中的列表。 从我的SQL语句中可以看到,字段和是唯一的。我的表中只允许该组合的一行。 当我用类的新列表更新父实体()时,我希望Hibernate删除旧列表本身并创建新实体。一个一个地更新孩子是有点困难的。这就是为什么我要直接删除所有相关的孩子。 当我更新并为其提供包含具有唯一名称的和(数据库中已存在的实体)组合的列表时,我会出现