2012-02-27 2 views
1

я следующее (простое) отображение:JPA (с Hibernate) reatach существующих объектов в @OneToMany -

@Entity 
public class Role { 
    @OneToMany(fetch = FetchType.EAGER) private Set<Privilege> privileges; 
} 

Я хочу сделать следующее (упрощенно):

  • У меня есть создал Role (R1) с Privilege лица (P1)
  • Я хочу, чтобы создать другую, новую роль (R2) и дать ему ту же привилегию (P1)

Итак, когда новый R2 создан, он также установлен в Set of Privilege (HashSet not PersistedSet), но содержит существующий P1; Кажется, что Hibernate не в состоянии признать тот факт, что P1 уже существует и правильно упорствовать соотношение

Я уже пытался к следующему:

  • сохранить новую роль (R2) с обеими entityManager.persist и entityManager.merge
  • добавить каскадные = {CascadeType.ALL} для отображения между ролями и правами доступом
  • попытался поджать привилегии (таким образом, чтобы объекты существуют в текущем Sess ион) перед сохранением новой роли

Я не пробовал (пока):

  • указания @JoinColumn(name = "PRIV_ID") на отображение
  • делать больше операций вручную (например, первый сохраняющиеся пустой Role лица и их обновление Привилегий) - последнее средство

Я думаю, что это довольно стандартная утилита, поэтому, возможно, мне не хватает чего-то, что мешает мне сохранить эту ассоциацию pr operly. Любые идеи? Спасибо.

ответ

1

Если две роли могут иметь одинаковую привилегию, то это уже не OneToMany, а ManyToMany. Поэтому начните с изменения отображения коллекции privileges.

Затем покажите нам код, который добавляет P1 к набору привилегий R2. Я подозреваю, что вы создаете новый экземпляр Privilege, вместо того, чтобы получать P1 из сеанса.

0

OneToMany подразумевает, что привилегия имеет обратную ссылку (через ключ foreigh) для - также, она принадлежит к одной и только одной роли и не может принадлежать двум. Вам нужно много-ко-многим для достижения своей цели.

+0

Хотя диагностика правильная, объяснение неверно: OneToMany может быть однонаправленным (так, без обратной ссылки), и если это так, то по умолчанию стратегия заключается в использовании соединения таблицу, как и со многими для многих ассоциаций (но с уникальным ограничением). –