Загрузка дочерних объектов с помощью JPA в Google App Engine - PullRequest
4 голосов
/ 16 мая 2010

Я не могу загрузить дочерние объекты после их сохранения в Google App Engine.Я уверен, что они экономят, потому что я могу видеть их в хранилище данных.Например, если у меня есть следующие две сущности.

public class Parent implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String key;
    @OneToMany(cascade=CascadeType.ALL)
    private List<Child> children = new ArrayList<Child>();

    //getters and setters
}

public class Child implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String key;
    private String name;
    @ManyToOne
    private Parent parent;
    //getters and setters
}

Я могу прекрасно сохранить родителя и ребенка, используя следующее:

Parent parent = new Parent();
Child child = new Child();
child.setName("Child Object");
parent.getChildren().add(child);
em.persist(parent);

Однако, когда я пытаюсь загрузить родителяи затем пытаюсь получить доступ к детям (я знаю, что GAE лениво загружается). Я не получаю записи о детях.

//parent already successfully loaded
parent.getChildren.size(); // this returns 0

Я смотрел учебник после учебника, и пока ничего не получалось.Я использую версию 1.3.3.1 SDK.Я видел проблему, упомянутую в различных блогах и даже на форумах App Engine, но ответ всегда связан с JDO.Я делаю что-то не так или у кого-то еще была эта проблема и она решена для JPA?

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Не закрывайте менеджер сущностей и не вызывайте дочернее свойство, оно не пустое. Ленивые находят детей только в том случае, если менеджер сущностей открыт.

1 голос
/ 17 апреля 2014

У меня раньше была такая же проблема, насколько это странно странно, но у меня ничего не получалось, пока я не изменил

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL)

до

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)

Дайте ему шанс и дайте мне знать

0 голосов
/ 17 мая 2010

Попробуйте добавить mappedBy в аннотацию @OneToMany, как показано ниже:

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
private List<Child> children = new ArrayList<Child>();

Кроме того, вы должны добавить ниже к аннотации @ManyToOne:

@ManyToOne(fetch = FetchType.LAZY)

Кроме того, я считаю полезным использовать классы Google Key и KeyFactory, потому что тогда вы можете явно указать родителя при создании дочернего ключа.

this.key = KeyFactory.createKey(parentKey, getClass().getSimpleName(), name);
...