6

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 では、childEntityListChild を追加してもサイズは毎回同じです。サーバーを再起動したときにのみ、親のすべての子が表示されます。

childEntityList親クラスの はいつ満たされますか? のために自動的に@OneToManyですか?

誰かがそれを説明できますか?

更新: 親リストに子オブジェクトを追加/削除するたびに EntityManager をマージする必要がありますか、それとも他のことを行う必要がありますか?

4

3 に答える 3

5

双方向の関係の両側を維持する必要があります。ここを参照してください。

于 2013-01-08T14:43:07.210 に答える
1

(Hibernate ではなく JPA を使用しています!)

Hibernate API を使用していないことを意味していると思います。
JPA は単なる永続 API 仕様であり、それ自体では何もしません。
したがって、JPAを使用している場合...永続化を行うために何かを使用しています。

JPA は、永続化作業を Hibernate、EclipseLink、OpenJPA などの永続化エンジンに委任します。

特定の永続化プロバイダーで JPA インターフェースを使用するようにアプリを構成できます。または、アプリが JEE コンテナーで実行されている場合は、GlassFish (OpenJPA を使用)、WebLogic (EclipseLink を使用)、TomEE ( OpenJPA を使用します)。

親リストから子オブジェクトを追加/削除するたびに EntityManager をマージする必要があります...

EntityManager をマージしません。親エンティティをマージするために使用します。

parent = em.merge(parent);

あなたの質問に関連して、このようにmerge()を使用すると...(そしてマッピングがCascadeType.ALLを指定しているため)ページ(「サイト1」)をリロードすると、更新されたオブジェクトネットワークを含む更新された親オブジェクトを取得する必要があります新しく追加された子を含む、マージ (親) の前に行った変更。

于 2015-10-21T00:21:41.160 に答える
0

はい、親エンティティをマージする必要があります。私は同じ問題を抱えていましたが、親エンティティをマージすると解決しました。また、関係の両側を維持する必要があります。

于 2014-08-29T06:02:35.803 に答える