このようなコードがあります
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);
削除コードも同様に見えます。つまり、最初にオブジェクトが所有者のコレクションから削除され、次にdeletePersistent
persistenceManger が呼び出されます。
MyQuestion は、このオブジェクトを明示的に親に追加する必要があるのですか? それmakePeristent()
だけでは十分ではありませんか?私が尋ねる理由は、この 'getRoot()' でいくらかのパフォーマンス ヒットが見られるからです (基礎となるオブジェクトが遅延ロードされている場合でも、これらのコレクションの量が多い場合はパフォーマンス ヒットがあります)。
実行時に、この「ルート」オブジェクトのキャッシュされた/取り外し可能なコピー (ディープ クローンなど) を使用し、必要な要素はこの「ルート」からのみ取得されます。データベースに変更が加えられた場合は、このキャッシュを無効にして、これをリロードします。ルート化して再度キャッシュします。
子要素が明示的に親に追加または親から削除されているコードを削除しても安全ですか? または、定義したマッピングに基づいて本当に必要ですか (実行時にすべての子要素を取得するためにキャッシュされた (複製された) ルートに依存しているという事実を考慮して) ? 実行時 (クローンされた深いユーザー) とオブジェクトの作成時に同じ「ルート」を使用していないことに注意してください。実行時に他の要素をフェッチするために「ルート」に依存しているだけです。この種のシナリオに対処した団体があれば教えてください。