GAE JPA DataNucleus Создание объекта «один ко многим» - PullRequest
4 голосов
/ 23 сентября 2010

Допустим, у владельца есть коллекция часов.

Я пытаюсь создать часы и добавить вновь созданные часы в коллекцию часов существующего владельца (массив).

Мой метод следующий:

public void add(String ownerName, String watchName) {

    Owner o = new OwnerDAO().retrieve(ownerName); //retrieves owner object without fail

    EntityManager em = EMF.get().createEntityManager();
    EntityTransaction t = em.getTransaction();

    Watch w = new Watch(watchName);

    Owner owner = em.merge(o);

    t.begin();
    owner.getWatches().add(w);
    t.commit();

    em.close();

}

Код работает в локальной среде GAE без проблем, но при работе в онлайновой среде GAE возникла следующая проблема:

org.datanucleus.store.mapped.scostore.FKListStore$1 fetchFields: Object "package.Owner@2b6fc7" has a collection "package.Owner.watches" yet element "package.Watch@dcc4e2" doesnt have the owner set. Managing the relation and setting the owner.

Могу ли я узнать, как можно решить эту проблему?Спасибо!

Сущности:

Владелец:

@id
private String name;

@OneToMany(mappedBy = "owner",
targetEntity = Watch.class, cascade = CascadeType.ALL)
private List<Watch> watches= new ArrayList<Watch>();

Часы:

@id
private String name;

@ManyToOne()
private Owner owner;

Большое спасибо заранее!

С наилучшими пожеланиями,

Джейсон

1 Ответ

3 голосов
/ 23 сентября 2010

Ваша связь является двунаправленной, но вы неправильно настраиваете обе стороны ссылки, о чем сообщается в сообщении об ошибке. Ваш код должен быть:

...
owner.getWatches().add(w);
w.setOwner(owner); //set the other side of the relation
t.commit();

Типичным шаблоном является использование методов управления защитными связями для правильной установки обеих сторон ассоциации, например так (в Owner):

public void addToWatches(Watch watch) {
    watches.add(watch);
    watch.setOwner(this);
}

И ваш код станет:

...
owner.addToWatches(w);
t.commit();
...