【问题标题】:JDO not fetching collection member fieldJDO 未获取集合成员字段
【发布时间】:2009-12-24 04:55:03
【问题描述】:

上课:

class Node implements Serializable
{
    private String name;

    public String getName { return name; }
    public void setName(String val){ name = val; }

    public Node(){}
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
class NodeBag implements Serializable
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Long id;

    @Persistent(serialized="true")
    private ArrayList<Node> nodes = new ArrayList<Node>();

    public String getNodes { return nodes; }
    public void setNodes(ArrayList<Node> val){ nodes = val; }

    public NodeBag(){}
}

我可以用这个把它保存到数据库中

PersistenceManager pm = PMF.getManager();
try
{
 pm.makePersistent(newBag);
}
finally
{
 pm.close();
}

但是当我加载它时

PersistenceManager pm = PMF.getManager();
Query q = pm.newQuery(NodeBag.class);
try
{
 List<NodeBag> pipelines = (List<NodeBag>)q.execute();
 return nodeBags; // nodeBags[0].nodes is always empty
}
finally
{
 q.closeAll();
}

Nodebag.nodes 始终为空!

我错过了什么吗?

提前致谢。

问候, 保罗

【问题讨论】:

    标签: java jdo datanucleus persistent


    【解决方案1】:

    在返回对象的调用中,您可以使用 FetchPlan 指定要返回的 FetchGroup。有关 FetchGroup 选项的更多信息,请参阅 JDO docs

    您可以通过在 PersistenceManager 中指定要使用的 FetchGroup 来确保获取所有实体。修改后的代码如下:

    PersistenceManager pm = PMF.getManager();
    pm.getFetchPlan().setGroup(FetchGroup.ALL);
    Query q = pm.newQuery(NodeBag.class);
    try {
      List<NodeBag> pipelines = (List<NodeBag>)q.execute();
      return nodeBags; // nodeBags[0].nodes is always empty
    } finally {
      q.closeAll();
    }
    

    【讨论】:

      【解决方案2】:

      我花了很长时间让 fetch 组开始工作。 QueryPersistenceManager 都有一个 getFetchPlan(),但似乎只有 PersistenceManager 上的那个有效。

      另外,请确保您的对象可分离并在结果上使用pm.detachCopyAll()

      【讨论】:

        【解决方案3】:

        错过了将其放入获取计划中?根据 DataNucleus 文档和 JDO 规范,可能在默认提取组中标记,或访问该字段,或放入自定义提取计划。

        【讨论】:

          【解决方案4】:

          实际上,我还希望通过将其转换为 JSON 来通过网络返回答案。 而且我已经设法加载子对象。我使用的技巧是分离。通过分离,一切都将被加载。

          谢谢。

          【讨论】:

            【解决方案5】:

            使用集合 insted of List,只要它在事务中,它就应该开始工作

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-23
              • 2020-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-21
              相关资源
              最近更新 更多