2011-09-22 2 views
4

Я хочу реализовать иерархию ролей, но довольно новичок в JPA Annotations.JPA Аннотации для отношения «многие ко многим» между объектами одного и того же объекта

У меня есть Role Entity с именем и идентификатор (неявный через AbstractPersistable):

@Entity 
@Table(name="role") 
public class Role extends AbstractPersistable<Long> { 
    private static final long serialVersionUID = 8127092070228048914L; 
    private String name; 

Теперь я хочу, чтобы иметь возможность определить следующие соотношения:

  • роль может иметь многие дочерние роли
  • роль может быть ребенок много ролей

Как Wou ld Я делаю это с аннотациями Hibernate? Могу ли я определить это внутри объекта роли

@ManyToMany(cascade = CascadeType.MERGE) 
@JoinTable(name = "role_hierarchy", 
      joinColumns = { @JoinColumn(name = "role_id")}, 
      inverseJoinColumns={@JoinColumn(name="child_role_id")}) 
private List<Role> roles; 

@ManyToMany(cascade = CascadeType.MERGE) 
@JoinTable(name = "role_hierarchy", 
      joinColumns = { @JoinColumn(name = "child_role_id")}, 
      inverseJoinColumns={@JoinColumn(name="role_id")}) 
private List<Role> children; 

Я нахожусь на правильном пути? Что мне не хватает?

Большое спасибо за помощь!


EDIT: - удалено, как это было решено -


EDIT 2:

Похоже, у меня есть некоторые ошибки в моем стеке приложений. На уровне определения модели role_hierarchy работает просто отлично, поэтому никогда не обращайте внимание на EDIT 1 ...

НО: Оба способа, похоже, работают (это создает запись таблицы m: n, каскадное удаление и извлечение родителей и дети для юридического лица):

  • мое предложение об определении столбца присоединиться к обеим сторонам, не mappedBy собственности на @ManyToMany аннотацию
  • , а также определении стороны Обладание и обратную сторону.

В чем разница? Это имеет значение?

ответ

14

Двунаправленная связь состоит из собственных и обратных сторон.

На стороне владеющим вы объявляете физические свойства отношений:

@ManyToMany(cascade = CascadeType.MERGE) 
@JoinTable(name = "role_hierarchy", 
      joinColumns = { @JoinColumn(name = "role_id")}, 
      inverseJoinColumns={@JoinColumn(name="child_role_id")}) 
private List<Role> roles; 

На обратной стороне вы указать на соответствующей стороне, владеющей с mappedBy атрибутом:

@ManyToMany(cascade = CascadeType.MERGE, mappedBy = "roles") 
private List<Role> children;  

Для многих-to во многих отношениях не имеет значения, какая сторона является стороной-обладателем (если вы изменяете обе стороны последовательно, так как только изменения на стороне владельца распространяются в базу данных).

Смотрите также:

+0

Похоже, способ работы, а также шахты (см edit2). Интересно, в чем разница ...? – Pete

+0

@Pete: Без 'mappedBy' вы создаете две однонаправленные отношения вместо двунаправленного sinlge. Я не уверен, как это будет работать, когда две отношения используют одну и ту же таблицу соединений. – axtavt

Смежные вопросы