0

「A」、「B」、「C」の3つのエンティティがあります。


@Entity
public class A implements Serializable {
    ... 

    private B b;  

    @OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
    @Cascade({CascadeType.ALL})
    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    } 

    ...
}

@Entity
public class B implements Serializable {
    ...

    private A a;

    @OneToOne(fetch = FetchType.LAZY)
    public A getA() {
         return a;
    }

    public void setA(A a) {
         this.a = a;
    }

    ...

    private Collection<C> cCollection;

    @OneToMany(mappedBy = "b", fetch = FetchType.LAZY)
    public Collection<C> getCCollection() {
        return cCollection;
    }

    public void setCCollection(Collection<C> cCollection) {
        this.cCollection = cCollection;
    }
    ...
}

@Entity
public class C implements Serializable {
    ...

    private B b;
    @ManyToOne(optional = false, fetch = FetchType.LAZY )
    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b= b;
    }
}

B.cCollectionを更新して(Cオブジェクトを追加または削除して)、オブジェクトaを更新すると、これらの変更がa.getB()。getCCollection()の結果に影響することが予想されますが、それは発生せず、cCollectionリストは更新されません。 。refresh()操作が間違っていますか?

//Adding or removal C objects to/from a.getB().getCCollection()
//Persisting changes
myEM.refresh(a);

(注:私は休止状態とJPA 2.0を使用しています。データベースにデータを永続化しても問題はなく、実際に機能します)。

4

2 に答える 2

0

代わりにmergeメソッドを使用する必要があります:http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html

myEM.merge(a);
于 2012-09-05T06:45:05.177 に答える
0

「refresh()メソッドを使用して、オブジェクトとそのすべてのコレクションをいつでも再ロードできます。これは、データベーストリガーを使用してオブジェクトの一部のプロパティを初期化する場合に役立ちます。」

「Hibernateはデータベースからどのくらいの量をロードし、いくつのSQL SELECTを使用しますか?これはフェッチ戦略によって異なります。」

第10章:オブジェクトの操作にアクセスして詳細を確認してください

于 2014-08-01T11:14:09.480 に答える