Обновление OneToMany не работает в дочернем классе - PullRequest
1 голос
/ 10 февраля 2011

У меня есть отношения OnetoMany между Person и Role class. Человек может иметь несколько ролей. Когда я создаю нового человека, роли (существующие записи) должны обновляться с идентификаторами людей. Я использую отображение @OneToMany с CascadeType All, но класс Role не обновляется с Person id. Если при создании персонажа создается новая роль и устанавливается как связь, она работает нормально. Но когда вы создаете нового человека и пытаетесь установить его в существующую роль, он не обновляется.

1 Ответ

0 голосов
/ 10 февраля 2011

Это необходимо сделать вручную для двунаправленных ссылок. Учебное пособие по гибернации дает хороший пример: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#tutorial-associations-usingbidir

В вашем случае: на стороне OneToMany защитите метод setPersons (...) и определите открытый метод addPerson (Person p), например:

public void addPerson(Person p) {
    this.getPersons().add(p);
    p.setRole(this);
}

Кстати, если у человека может быть несколько ролей и роль может быть назначена нескольким людям, то, скорее всего, вам действительно нужны отношения ManyToMany. Итак, у вас будет:

public void addPerson(Person p) {
    this.getPersons().add(p);
    p.getRoles().add(this);
}

А в классе Персона:

public void addRole(Role r) {
    this.getRoles().add(r);
    r.getPersons().add(this);
}

Это необходимо, потому что, в отличие от EJB 2.x Контейнерно-управляемых отношений (CMR), это не обрабатывается автоматически. Hibernate использует подход POJO. Недостатком CMR является то, что для создания объектов требуется контейнер, тогда как вы можете создавать объекты POJO везде. И если вы их создадите, это просто Простые Старые Объекты Java, никаких хитростей.

Вот хорошая статья в блоге, которая обсуждает это далее: http://blog.xebia.com/2009/03/16/jpa-implementation-patterns-bidirectional-assocations/

...