JDO PersistentManager的makePersistent不足以创建子元素吗?

时间:2012-07-02 12:30:54

标签: java jdo

我有一些像这样的代码

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();

我无法理解的是为什么我们需要将这个新的Custom对象添加到所有者? SomeUtil.getRoot().getChildElements().add(customObj); 删除代码看起来也很相似,即首先将对象从其所有者的集合中删除,然后调用deletePersistent的persistenceManger。

MyQuestion是 我们真的需要明确地将此对象添加到父对象吗?单独makePeristent()还不够吗?我之所以问这个问题的原因是我看到这个'getRoot()'有一些性能受到影响(即使底层对象被延迟加载,这些集合的体积也会受到一些性能影响)很高兴。)

在运行时,我们使用此“根”对象的缓存/可分离副本(比如深度克隆),并且仅从此“根”检索任何所需元素。如果对数据库进行了任何修改,则我们使此缓存无效并重新加载此根并再次缓存它。

在父元素中明确添加或删除子元素的代码是否安全?或者它是否真的需要基于我们定义的映射(并且考虑到我们依赖缓存(克隆)root来检索运行时中的所有子元素)? 请注意,在运行时(深度用户克隆)和创建对象期间,我们没有使用相同的“root”。我们依赖于“root”来在运行时获取其他元素。 请让我知道是否有任何机构处理过这种情况。

2 个答案:

答案 0 :(得分: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

正如我先前所说,我们依赖运行时的这个根对象来检索任何子元素。 即使直接查询孩子,也不适合我们。

看起来我们只能通过将该子项添加到父项来实现此目的。 但是我们想要避免这种情况,因为检索父(root)在性能上有一些打击(即使它们被延迟加载),因为这个root有很多其他的子集合元素。在运行时,我们通常会加载一次root并缓存干净的副本。

答案 1 :(得分:0)

可达性的JDO持久性在JDO规范中得到了很好的定义。 DataNucleus日志会告诉您持久性和时间。我强烈建议阅读这两个资源