My question here is almost similar to my other question Explicit delete on JPA relationships
but I thought of simplifying it further to warrant more detailed answers.
Imagine I have a OneToMany relationship between a parent and a 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;
}
In my UI, I am showing a list of parent. User can choose one parent and he/she can edit the list of its children.
To show this, I have used a currentParent variable to represent the current parent edited.
User can choose to add/edit children's name.
Upon clicking a button, I would save the new children's list using an EJB call.
@ViewScoped
public class MyBean(){
private Parent currentParent;
@EJB
private MyEJB myEJB;
public void saveChanges(){
myEJB.save(currentParent);
}
}
My EJB call looks like this.
@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);
}
}
}
My problem is that, I am able to change the name of the parent but any changes to the childrens list is not reflected into the DB.
It does not alter or execute any SQL to delete/update/add childs.
What could be the cause?
UPDATE
Well after some trial and error and reading thru various links, it seems that setting the orphanRemoval option in my @onetomany would solve my problem. Eclipselink automatically deletes the orphan rows during merging.
So much for JPA complexity..
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval = true)
private List<Child> children;
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…