2017-02-21 61 views
0

Существует однонаправленный ManyToMany отображение между Role и Privilege с Role как владеющим объектом, как такHibernate Однонаправленного ManyToMany Update Target Учредительной связь

Role

@Entity 
public class Role extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "role_id") 
    private Integer roleId; 
    @Size(max = 45) 
    @Column(name = "role") 
    private String role; 

    @JoinTable(name = "role_privilege", joinColumns = { 
      @JoinColumn(name = "role_role_id", referencedColumnName = "role_id")}, inverseJoinColumns = { 
      @JoinColumn(name = "privilege_privilege_id", referencedColumnName = "privilege_id")}) 
    @ManyToMany(
      cascade = { 
       CascadeType.DETACH, 
       CascadeType.MERGE, 
       CascadeType.REFRESH, 
       CascadeType.PERSIST }, fetch = FetchType.EAGER, targetEntity = Privilege.class) 
    private Collection<Privilege> privilegeCollection; 

    @Transient 
    private Collection<Privilege> parentPrivilegeCollection; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "roleId") 
    @JsonIgnore 
    private Collection<User> userCollection; 

    public Role() { 
    } 
    //getters,setter,hashcode,equals removed for brevity 
} 

Privilege

@Entity 
public class Privilege extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "privilege_id") 
    private Integer privilegeId; 
    @Size(max = 45) 
    @Column(name = "name") 
    private String name; 
    @Size(max = 150) 
    @Column(name = "description") 
    private String description; 
    @Size(max = 45) 
    @Column(name = "friendly_name") 
    private String friendlyName; 
    @JoinTable(name = "privilege_hierachy", joinColumns = { 
      @JoinColumn(name = "parent_privilege", referencedColumnName = "privilege_id")}, inverseJoinColumns = { 
      @JoinColumn(name = "child_privilege", referencedColumnName = "privilege_id")}) 
    @ManyToMany 
    private Collection<Privilege> privilegeCollection; 

    public Privilege() { 
    } 
} 

Проблемой

Всякий раз, когда я устанавливаю обновленный список привилегий в роли и обновлении, таблица соединений успешно обновляется, не удаляя ни целевой, ни собственный объект, и это желаемый результат. Проблема заключается в обновлении, это также влияет на другую таблицу самоподключения в Privilege под названием privilege_hierachy, которая не является ожидаемой.

Возможно ли спящий режим обновить только отношения между мною и многими другими без изменений.

Spring Data JPA используется для сохраняемости данных

+0

, пожалуйста, добавьте метод, в котором вы выполняете обновление. –

+0

Spring Data Jpa репозиторий используется для сохранения данных. –

ответ

1

Это звучит, как вы обновляете привилегии (удаление старых привилегий, а) добавление новых. Если вы это сделаете, очевидно, что вторая таблица соединений (таблица самореференций) может быть обновлена ​​новыми строками, основываясь на том, что вы передаете.

Я вижу, что для таблицы саморегуляции Privilege вы не устанавливаете каскадный тип. По умолчанию он не работает, и это звучит так, как вы хотите. Но моя догадка основана на том, что вы сказали «Всякий раз, когда я устанавливаю обновленный список привилегий в роли», и это говорит о том, что вы создаете новые привилегии для роли, вместо того, чтобы использовать существующие привилегии и связывать их с ролью.

+0

Спасибо, что это сработало, моя ошибка была так же, как вы сказали, '... ... обновление привилегий (удаление старых привилегий и) добавление новые ".' –

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

  • Нет связанных вопросов^_^