gpt4 book ai didi

java - 为什么合并不是级联在一对多关系上

转载 作者:太空狗 更新时间:2023-10-29 22:57:46 25 4
gpt4 key购买 nike

我的问题与我的其他问题几乎相似 Explicit delete on JPA relationships但我想进一步简化它以保证得到更详细的答案。

假设我在 parent 和 child 之间有一对多关系。

@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Child> children;
}
@Entity
public class Child {
private String name;
@ManyToOne
private Parent owner;
}

在我的用户界面中,我显示了一个父级列表。用户可以选择一位 parent ,他/她可以编辑其 child 的列表。为了表明这一点,我使用了一个 currentParent 变量来表示当前编辑的父对象。用户可以选择添加/编辑 child 的名字。

单击按钮后,我将使用 EJB 调用保存新的子列表。

@ViewScoped
public class MyBean(){
private Parent currentParent;
@EJB
private MyEJB myEJB;

public void saveChanges(){
myEJB.save(currentParent);
}
}

我的 EJB 调用如下所示。

@Stateless
public class MyEJB{
@PersistenceContext(unitName = "MyPU")
private EntityManager em;

public void save(Parent parentNew){
Parent pOld = em.find(entityClass, p.getId());
if(pOld !=null){
pOld.setName(parentNew.getName());
pOld.setChildren(parentNew.getChildren());
em.merge(pOld);
}
}
}

我的问题是,我可以更改父项的名称,但对子项列表的任何更改都不会反射(reflect)到数据库中。它不会更改或执行任何 SQL 来删除/更新/添加子项。

可能是什么原因?

更新

经过反复试验并阅读各种链接后,似乎在我的@onetomany 中设置 orphanRemoval 选项可以解决我的问题。 Eclipselink 在合并期间自动删除孤立行。

JPA 的复杂性就这么多..

@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval = true)
private List<Child> children;
}

最佳答案

这是合并的标准问题。集合中子对象的更改将被拾取。

合并调用只能级联在列表中的对象上,因此对不在列表中的对象的更改会丢失。不幸的是,oneToMany 不拥有关系: child 的 ManyToOne 拥有。因此,需要合并子实体才能看到更改并将其推送到数据库。子实体是独立的对象,更改时需要单独合并。那个,或者添加到不同的父/树以进行合并。

关于java - 为什么合并不是级联在一对多关系上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13153237/

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