【问题标题】:ArrayList of super class type超类类型的ArrayList
【发布时间】:2012-10-18 12:46:21
【问题描述】:

我在我的项目中使用 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;
    }

然后,我创建一个存储定义数组列表的类:

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

我的定义列表可以包含定义或子定义类型的对象。我创建了一个 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 个子元素。

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

如果我检查数据库,两个子元素都存在,但不再与它们的父元素链接。在我持久化对象后,该关系立即正确地存在于数据库中。

存储对象的图形表示:

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

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

非常感谢,

【问题讨论】:

  • 正如我在回答(对原始问题)的 cmets 中已经说过的那样,日志可以帮助您调试问题,告诉您什么是持久的以及何时保留。这就是调试问题的方式
  • mongodb的Datanucleus的日志?
  • 我检测到在 tx.commit 之后,dataneucleus 的记录器显示了我的 Master 对象的更新消息。但我不应该,因为我只做一个请求,不再做。这是消息:[DataNucleus.Datastore.Native] - 更新对象 StateManager[pc=model.Budget@27f2182c,lifecycle=P_NONTRANS_DIRTY] as { "_id" : { "$oid" : "50810e203004e185f33c46ae"}

标签: java mongodb jdo datanucleus


【解决方案1】:

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

【讨论】:

  • 我编辑了我的问题。我将 setMaxDepthSize 设置为 -1,但还是有问题。
  • 没有这样的setMaxDepthSize方法,可能你的意思是别的东西
  • 我使用了那个代码:'PersistenceManager pm = PMF.get().getPersistenceManager(); pm.getFetchPlan().setMaxFetchDepth(-1)'
  • 您有递归关系,错过了该页面上引用它的部分。该日志会告诉您正在分离的内容,以便您对其进行调试。为 JDO TCK 工作
  • 谢谢。我改变了我的问题,因为自从我创建了我的问题以来,我更深入地研究了我的代码并找到了真正的问题。问题:我存储了一个超类类型的 ArrayList。你能再读一遍我的问题吗?请告诉我您的反馈?非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2013-12-01
相关资源
最近更新 更多