JDO не выбирает поле члена коллекции - PullRequest
2 голосов
/ 24 декабря 2009

Есть класс:

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 всегда пуст!

Я что-то пропустил?

Заранее спасибо.

С уважением, Пол

Ответы [ 5 ]

1 голос
/ 21 сентября 2010

У меня было чертовски много времени, чтобы заставить выборочные группы работать. И Query, и PersistenceManager имеют getFetchPlan(), но, похоже, работает только тот, который на PersistenceManager.

Кроме того, убедитесь, что вы делаете объекты отсоединяемыми и используете pm.detachCopyAll() в результате.

1 голос
/ 29 июня 2010

При вызове для возврата объектов вы можете использовать FetchPlan, чтобы указать, какую FetchGroup вернуть. См. Документы JDO для получения дополнительной информации о параметрах FetchGroup.

Вы можете убедиться, что все объекты выбраны, указав в вашем 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();
}
0 голосов
/ 26 апреля 2014

Используйте коллекцию вместо List, и она должна начать работать, пока она находится внутри транзакции

0 голосов
/ 01 января 2010

На самом деле, я хотел также получить ответ по сети, преобразовав его в JSON. И мне удалось загрузить дочерние объекты. Уловка, которую я использую, является отделением. При отсоединении все будет загружено.

Спасибо.

0 голосов
/ 24 декабря 2009

Пропустили положить его в план выборки? отметьте в группе извлечения по умолчанию, возможно, или получите доступ к полю, или поместите в пользовательский план извлечения, согласно документам DataNucleus и спецификации JDO.

...