为什么合并不是在一对多关系上级联的
2022-09-03 02:48:46
我在这里的问题几乎与我关于JPA关系的显式删除的另一个问题相似,但我想进一步简化它,以确保更详细的答案。
想象一下,我在父母和孩子之间有一个一对多的关系。
@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;
}
在我的 UI 中,我显示父级列表。用户可以选择一个父项,他/她可以编辑其子项的列表。为了说明这一点,我使用了一个 currentParent 变量来表示当前编辑的父级。用户可以选择添加/编辑孩子的名字。
单击按钮后,我将使用 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);
}
}
}
我的问题是,我能够更改父级的名称,但对子级列表的任何更改都不会反映在数据库中。它不会更改或执行任何 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;
}