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); 删除代码看起来也很相似,即首先从其所有者的集合中删除对象,然后deletePersistent调用persistenceManger。

MyQuestion 是我们真的需要将此对象显式添加到父对象吗?单独一个还不够吗makePeristent()?我问的原因是我看到这个'getRoot()'对性能有一些影响(即使底层对象被延迟加载,当这些集合的数量很高时也会对性能产生一些影响)。

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

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

4

2 回答 2

1

我已经对此进行了测试并观察到,如果您在不知道父元素的情况下添加子元素,则无法使用 parent检索该子元素。

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

正如我之前所说,我们在运行时依赖这个根对象来检索任何子元素。即使直接查询孩子是可行的,但这对我们来说不是一个选择。

看起来我们只能通过将该孩子添加到父母来实现这一点。但是我们想避免这种情况,因为检索 parent(root) 对性能有一些影响(即使它们是延迟加载的),因为这个 root 有许多其他子集合元素。在运行时,我们通常会加载这个根并缓存干净的副本。

于 2012-07-03T12:57:04.173 回答
0

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

于 2012-07-03T11:27:04.250 回答