2011-02-10 3 views
1

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

+0

Некоторые примеры кода может оказаться полезным. – axtavt

+0

Это похоже на [эта проблема] (http://stackoverflow.com/questions/2441598/detached-entity-passed-to-persist-error-with-jpa-ejb-code/4905238#4905238). – zawhtut

ответ

0

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

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

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); 
} 

И в классе Person:

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

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

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

+0

Кому кто ниспровергнут: Это из официальной документации. У вас есть лучшее решение? (Примечание: Hibernate не выполняет * черную магию * на ваших объектах, что необходимо для автоматизации двунаправленных ссылок.) –