我正在使用JPA而不是Hibernate。我的人际关系存在以下问题。我有一个1:N的关系( parent : child )。
在JSP站点上,显示“父级”和“子级”。
如果我是第一次加载JSP-Site,然后将父级与子级一起保存,则一切正常。父项已保存,子项也已通过外键保存到数据库。
之后,将显示带有父级和子级的第二个JSP站点。
但是,如果我回到第一个站点并将第二个子项(添加子项)保存到现有的父项中,则childEntityList
仍然是旧的,我的意思是,新的子项不在此List内,而是插入数据库中。
为什么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);
}
// ...
}
child :
@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());
// ...
在查看代码中,即使我添加了一个子代,
childEntityList
的大小每次都相同。仅当我重新启动服务器时,才会显示“父级”的所有子级。
父类中的
childEntityList
何时填写?由于
@OneToMany
是自动生成的吗?有人可以解释吗?
更新:
我应该在每次从“父级”列表中添加/删除“子级”对象时合并EntityManager还是做其他事情?
最佳答案
您需要保持双向关系的双方。参见here。