2009-12-24 55 views
2

有一个类:JDO不取收集部件领域

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总是空的!

我错过了什么吗?

在此先感谢。

问候, 保罗

回答

0

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

0

实际上,我还希望通过将它转换为JSON来回答线路上的问题。 而我设法加载子对象。我使用的技巧是分离。通过分离,一切都会被加载。

谢谢。

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

我的时间越来越赫克取团体合作。 QueryPersistenceManager都有一个getFetchPlan(),但只有PersistenceManager上的一个似乎有效。

此外,请确保您的物品可拆卸,并使用pm.detachCopyAll()作为结果。

+0

+1任职后,我叫pm.detachCopy(T)内谢谢:)工作 – naikus 2013-09-02 12:15:28

0

使用收集insted的列表,它应该启动,只要它是一个交易