超类型的ArrayList

时间:2012-10-18 12:46:21

标签: java mongodb jdo datanucleus

我在我的项目中使用mongodb-datanucleus。我配置我的jdoconfig.xml如下:

    <persistence-manager-factory name="mongodb-factory">
    <property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
    <property name="javax.jdo.option.ConnectionURL" value="mongodb:localhost/test" />
    <property name="javax.jdo.option.Mapping" value="mongodb" />
    <property name="javax.jdo.option.ConnectionUserName" value="username" />
    <property name="javax.jdo.option.ConnectionPassword" value="psw" />
    <property name="javax.jdo.option.Optimistic" value="false" />
    <property name="datanucleus.autoCreateSchema" value="true" /> 
    <property name="datanucleus.DetachAllOnCommit" value="true" />
    <property name="datanucleus.DetachOnClose" value="true" />
    </persistence-manager-factory> 

我创建了超类:

    @PersistenceCapable(detachable="true")
    public class Definition implements Serializable {
        private String label;
    }

我创建了一个子类:

    @PersistenceCapable(detachable="true")
    public class SubDefinition extends Definition implements Serializable {
        private String label;
    }

然后,我创建了一个存储Definition:

的数组列表的类
    @PersistenceCapable(detachable="true")
    public class Master implements Serializable {
        @Persistent(defaultFetchGroup="true")
        @Element(dependent = "true")
        private List<Definition> subDef;
    }

我的定义列表可以包含Definition或SubDefinition类型的对象。我创建了一个Master对象并坚持下去。

当我从数据库中检索对象时会发生问题:

    Transaction tx = pm.currentTransaction();
    tx.begin();
    Query query = pm.newQuery();
    query.setClass(Master.class);
    Collection<Master> masterList = (Collection<Master>)query.execute();
    tx.commit();

如果我不重新启动服务器,代码将检索正确的对象,我的“subDef”列表已正确加载。但是,重新启动服务器数据库后,此对象未正确加载。变量“subDef”包含一个空数组。它应该包含2个子元素。

每次重新启动服务器后都会出现此问题。之后,我重新启动一些代码使数组为空。这不是我的代码之一。

如果我检查数据库,则两个子元素都存在,但不再与其父元素链接。在我持久化对象之后,关系正确地存在于DB中。

存储对象的图形表示:

    Master
      ->subDef
        ->Definition (children 1)
        ->Definition (children 2)

为什么我会遇到这个问题?也许不允许创建一个超类列表?

非常感谢,

1 个答案:

答案 0 :(得分:0)

所有文档,根据http://www.datanucleus.org/products/accessplatform_3_1/jdo/fetchgroup.html#static 关于“获取深度”的部分。