2009-12-24 54 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的列表,它應該啓動,只要它是一個交易