HibernateではなくJPAを使用しています。私は次のような私の関係に問題があります。私は 1:N の関係 (親:子) を持っています。
JSP サイトでは、親と子が表示されます。JSP サイトを (初めて) ロードし、親と子を保存すると、すべて問題ありません。親が保存され、子も外部キーで DB に保存されます。
その後、2 番目の JSP サイトが親と子とともに表示されます。
しかし、最初のサイトに戻って 2 番目の子 (子を追加) を既存の親に保存すると、それ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 をマージする必要がありますか、それとも他のことを行う必要がありますか?