gpt4 book ai didi

java - 一对多关系 JPA/Hibernate 删除链接

转载 作者:行者123 更新时间:2023-12-02 11:22:15 28 4
gpt4 key购买 nike

我的双向关系设置如下:

class Child{
@ManyToOne
@JoinTable(name = "CHILDREN_WITH_PARENT",
joinColumns = {@JoinColumn(name = "CHILD_ID")},
inverseJoinColumns = {@JoinColumn(name = "PARENT_ID")}
)
private Parent parent;
}

class Parent{
@OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
Set<Child> childrens = new HashSet<Child>();

public void persistOrMerge() {
EntityManager em = entityManager();
em.getTransaction().begin();
try {
if (em.contains(this))
return;
if (id == null || id == 0) {
this.setCreatedDate(new Date());
em.persist(this);
} else {
Parent prev = em.find(Parent.class, this.id);
if (prev == null) {
em.persist(this);
} else{
this.setCreatedDate(new Date());
em.merge(this);
}
}
em.flush();
em.getTransaction().commit();

} finally {
em.close();

}
}

}

在我的客户端,我有以下代码(GWT + EntityProxy)

Set<ChildProxy> children  = new HashSet<ChildProxy>();
if(childIsNew)
child = request.create(Children.class)
else
child = request.edit(oldChild)
children.add(child);
//If children are deleted, they are not contained in the set
//we are sending back to server
parent.setChildren(children)
parent.persistOrMerge();

此代码仅适用于添加新的子项。即使父类收到空子集,从父类中删除子项也不起作用。 JOIN 表中的链接不会被删除。

你能告诉我哪里遗漏了什么吗?

谢谢!

最佳答案

我首先要说的是,实体是直接使用实体管理器的实体,这是一个非常糟糕的想法。

EntityManager.merge() 方法返回实际的合并实例,这意味着在您的代码中,当您发出

em.merge(this)

您无法保证合并后的实例不再对应于“this”,从那时起您可能会看到各种逻辑问题。

如果您认为这没什么大不了的,那么您的问题应该通过在关系的 OneToMany 端打开孤儿删除来解决,前提是子级没有在其他关系中的其他任何地方使用。否则您将必须手动进行合并。

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true)
Set<Child> childrens = new HashSet<Child>();

JPA 2.0 规范指出

指定为 OneToOne 或 OneToMany 的关联支持使用 orphanRemoval选项。当 orphanRemoval 生效时,以下行为适用:

  • 如果作为目标的实体该关系已从关系(通过设置关系为 null 或删除关系中的实体集合),删除操作将应用于实体成为孤儿。删除操作是在冲洗时应用手术。孤儿搬迁功能旨在私有(private)“拥有”的实体由其父实体。便携的否则应用程序不得取决于特定的顺序删除,并且不得重新分配已成为孤儿的实体另一种关系或其他关系尝试坚持下去。如果实体成为孤儿是一种孤立的、新的或删除实体,语义孤儿移除不适用。
  • 如果删除操作应用于受管源实体,删除操作将被级联到关系目标符合符合第 3.2.3 节的规则,(以及因此没有必要指定级联=删除关系)[20]。

关于java - 一对多关系 JPA/Hibernate 删除链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641690/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com