0

このようなコードがあります

class root extends DomainObject{
Collection childElements;
Collection childElements2;
.....
//define other child element collections


Collection getChildElements(){
 return childElements;
}
// define other childElements getter/setter

私のpackage.jdoは、このようなマッピングを定義しています

      <class name="root" identity-type="datastore" detachable="true" persistence-capable-superclass="com.xxx.DomainObject">
        <inheritance strategy="new-table"/>
        <field name="childElements" persistence-modifier="persistent" default-fetch-group="true">
            <collection element-type="com.my.CustomClass" />
            <join/>
            <order column="idx"/>
            <extension vendor-name="jpox" key="cache-lazy-loading" value="false"/>
        </field>    

そして、カスタムクラス構造は次のようになります

class CustomClass extends DomainObject{
String name;
Collection otherElements;
.....


String getName(){
return name;
}    
Collection getOtherElements(){
 return otherElements;
}

com.my.CustomClass のオブジェクトを作成する場合、コードは次のようになります

persistenceManager().currentTransaction().begin();
CustomClass customObj = new CustomClass();
customobj.setName("someName");
//set other values    
persistenceManager.makePeristent(customObj);//persist
SomeUtil.getRoot().getChildElements().add(customObj);//add to its owner
persistenceManager.currentTransaction().commit();

SomeUtil の getRoot() のコードは次のようになります。

 Query q = persistenceManager.newQuery( root.class );
 Collection c = (Collection)q.execute();
  persistenceManager.retrieveAll( c );
   return (root)c.iterator().next();

私が理解できていないのは、なぜこの新しいカスタム オブジェクトを所有者に追加する必要があるのですか? SomeUtil.getRoot().getChildElements().add(customObj); 削除コードも同様に見えます。つまり、最初にオブジェクトが所有者のコレクションから削除され、次にdeletePersistentpersistenceManger が呼び出されます。

MyQuestion は、このオブジェクトを明示的に親に追加する必要があるのですか? それmakePeristent()だけでは十分ではありませんか?私が尋ねる理由は、この 'getRoot()' でいくらかのパフォーマンス ヒットが見られるからです (基礎となるオブジェクトが遅延ロードされている場合でも、これらのコレクションの量が多い場合はパフォーマンス ヒットがあります)。

実行時に、この「ルート」オブジェクトのキャッシュされた/取り外し可能なコピー (ディープ クローンなど) を使用し、必要な要素はこの「ルート」からのみ取得されます。データベースに変更が加えられた場合は、このキャッシュを無効にして、これをリロードします。ルート化して再度キャッシュします。

子要素が明示的に親に追加または親から削除されているコードを削除しても安全ですか? または、定義したマッピングに基づいて本当に必要ですか (実行時にすべての子要素を取得するためにキャッシュされた (複製された) ルートに依存しているという事実を考慮して) ? 実行時 (クローンされた深いユーザー) とオブジェクトの作成時に同じ「ルート」を使用していないことに注意してください。実行時に他の要素をフェッチするために「ルート」に依存しているだけです。この種のシナリオに対処した団体があれば教えてください。

4

2 に答える 2

1

私はこれをテストし、親の知識なしに子要素を追加すると、親を使用してその子要素を取得できないことを観察しました。

persistenceManager().currentTransaction().begin();
CustomClass customObj = new CustomClass();
customobj.setName("someName");
//set other values    
persistenceManager.makePeristent(customObj);//persist
//comment this
//SomeUtil.getRoot().getChildElements().add(customObj);//add to its owner
persistenceManager.currentTransaction().commit();

後でその親をロードしたときに、子要素が取得されていないことがわかりました。

 Collection c = SomeUtil.getRoot().getChildElements()
 // Iterate over this collection and found that element is not present

前述したように、実行時にこのルート オブジェクトに依存して子要素を取得します。子に直接クエリを実行することはできますが、それはオプションではありません。

その子を親に追加することによってのみこれを達成できるようです。しかし、このルートには他の多くの子コレクション要素があるため、親 (ルート) を取得すると (遅延ロードされた場合でも) パフォーマンスが低下するため、これを回避したかったのです。実行時には、通常、このルートを 1 回ロードし、クリーン コピーをキャッシュします。

于 2012-07-03T12:57:04.173 に答える
0

到達可能性による JDO 永続性は、JDO 仕様で明確に定義されています。DataNucleus ログは、何がいつ永続化されるかを示します。これら2つのリソースを読むことを強くお勧めします

于 2012-07-03T11:27:04.250 に答える