JPA Аннотации для связи «многие ко многим» между объектами одной и той же сущности - PullRequest
4 голосов
/ 22 сентября 2011

Я хочу реализовать иерархию ролей, но я довольно плохо знаком с аннотациями JPA.

У меня есть объект роли с именем и идентификатором (неявным через AbstractPersistable):

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

Теперь я хочу определить следующие отношения:

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

Как бы я это сделал с аннотациями 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;

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

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


РЕДАКТИРОВАТЬ: - удалено, как было решено -


РЕДАКТИРОВАТЬ 2:

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

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

  • мое предложение об определении столбца объединения для обеих сторон без свойства mappedBy в аннотации @ManyToMany
  • , а также определениявладеющая сторона и обратная сторона.

Какая разница?Имеет ли это значение?

1 Ответ

14 голосов
/ 22 сентября 2011

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

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

@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;    

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

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

...