我使用的是 JPA 而不是休眠。我的关系有如下问题。我有一个 1:N 的关系(父母:孩子)。
在 JSP 站点上,将显示父项和子项。如果我(第一次)加载 JSP-Site 并保存一个父级和一个子级,一切都很好。父母被保存,孩子也被保存到带有外键的数据库中。
之后,将显示第二个 JSP-Site,其中包含 Parent 和 Children。
但是如果我回到第一个站点并将第二个子项(添加子项)保存到现有的父项中,那childEntityList
仍然是旧的,我的意思是,新的子项不在此列表中,而是插入到数据库中。
为什么childEntityList
是旧的并且不更新?
家长:
@Entity
@Table(schema = "test", name = "Parent")
@XmlRootElement
@NamedQueries({...})
public class Parent implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "A_SEQ")
@Basic(optional = false)
@NotNull
@Column(name = "ID")
private int id;
@OneToMany(mappedBy = "p", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<ChildEntity> childEntityList = new ArrayList<ChildEntity>();
// ...
public List<ChildEntity> getChildEntityList() {
return childEntityList;
}
public void setChildEntityList(List<ChildEntity> childEntityList) {
this.childEntityList = childEntityList;
}
public void addChildEntityToParent(ChildEntity c) {
this.childEntityList.add(c);
if(c.getParent() != this) {
c.setParent(this);
}
}
public void removeChildEntityFromParent(ChildEntity c) {
childEntityList.remove(c);
}
// ...
}
孩子:
@Entity
@Table( name = "Child" )
@NamedQueries({...})
public class ChildEntity implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column( name = "CHILD_ID" )
private Long childId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID")
private Parent p;
// ...
public Parent getParent() {
return p;
}
public void setParent(Parent p) {
this.p= p;
if(!p.getChildEntityList().contains(this)) {
p.getChildEntityList().add(this);
}
}
保存代码:
Parent p = new Parent(...);
ChildEntity c = new ChildEntity(...);
p.addChildEntityToParent(c);
childEntityFacade.create(c);
查看代码:
// ...
public doSomething(Parent p) {
super(p);
}
// ...
List<ChildEntity> cList = p.getChildEntityList();
System.out.print("Size: " + c.size());
// ...
在 View-Code 中,childEntityList
即使我添加了一个 Child,每次的大小都是相同的。只有当我重新启动服务器时,才会显示父级的所有子级。
什么时候childEntityList
填写父类中的?它是自动的,因为@OneToMany
?
有人可以解释一下吗?
更新: 每次从父列表中添加/删除子对象时,我应该合并 EntityManager 还是做其他事情?