0

Java EE、Netbeans、およびファサードセッションBeanを使用してJPAレイヤー(eclipselink)を実装しています。

たとえば、2つのテーブルがあります。Garden(1)---> Tree(n)。

(スクリプトA)ここで、このスニペットを実行します。

Garden mGarden = new Garden();
.....
gardenFacade.create(garden)

(スクリプトB)次に:

Tree oneTree = new Tree();
oneTree.setGarden(mGarden);
treeFacade.create(oneTree);

このようにして、エンティティツリーがデータベースに正しく追加され、外部キーが正しくなります。

(スクリプトC)呼び出すと:

Garden findGarden = gardenFacade.find(gardenId);
int count = findGarden.getTreeCollection().size();

私はカウント=0!!! Glassfishを再起動するか、アプリをリロードして、これらのスニペットを実行すると、カウント=1になります。

したがって、スクリプトBを次のように変更すると、これは永続コンテキスト同期の問題だと思います。

Tree oneTree = new Tree();
oneTree.setGarden(mGarden);
treeFacade.create(oneTree);

mGarden.getTreeCollection().add(oneTree);
gardenFacade.edit(mGarden);

すべて正しく動作します!この問題を解決するにはどうすればよいですか?

編集:

create --> getEntityManager().persist(entity);
edit ----> getEntityManager().merge(entity);
find ----> getEntityManager().find(entityClass, id);
4

1 に答える 1

0

これらの呼び出しはすべて同じ休止状態セッションを使用しているように見えますが、コレクションの両側を適切に初期化できなかったため、もちろんコレクションには何も取得されません。

Garden mGarden = new Garden(); // create a new Garden instance
session.persist(mGarden); // now this Garden instance is persistent. 
                          // Its state will be written to the database at the 
                          // next flush
Tree oneTree = new Tree(); // create a new Tree instance
oneTree.setGarden(mGarden); // set the garden of the tree. This is a basic, simple 
                            // Java method call. Nothing will magically add the tree
                            // to the garden collection of trees if you don't do 
                            // it explicitely
session.persist(oneTree); // now this Tree instance is persistent. 
                          // Its state will be written to the database at the 
                          // next flush. 
Garden findGarden = session.get(Garden.class, gardenId); 
    // returns the garden that has the specific ID. It's already in the session: 
    // you created and attached it to the session at the beginning. And you 
    // never added anything to its collection of trees
于 2013-01-22T16:00:05.103 に答える