2016-07-11 46 views
4

我有這樣的使用情況:春天JPA多對多:刪除實體,刪除條目連接表,但不刪除對方

  • 我的用戶。
  • 我有團體。
  • 用戶和組之間存在N:N關係。
  • 我無法刪除用戶。
  • 如果我刪除了一個組,那麼該組中的用戶不應該被刪除。

用戶側:

@ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
        name = "USERS_GROUPS", 
        joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID") , 
        inverseJoinColumns = @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")) 
    private List<GroupJPA> groups; 

組方:

@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL) 
private List<UserJPA> returnsList; 

如果我從用戶組列表中刪除一個組,該組會從用戶的列表中刪除,它就會從加入刪除表,它不會從組表中刪除。這是慾望的行爲。

但是,如果我刪除整個組,連接表中的所有引用都會被刪除,但同時用戶也會被刪除!這不可能發生。

我正在使用4.3.5.Final和Spring 4.3.0.RELEASE。

+0

這似乎是一個Hibernate/JPA問題;我不認爲這裏涉及到Spring。 – chrylis

+1

可能可能會幫助你[級聯刪除](http://stackoverflow.com/questions/14585836/hibernate-many-to-many-cascading-delete)。 –

回答

2

您需要從

@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL) 
private List<UserJPA> returnsList; 

刪除級聯= CascadeType.ALL級聯被傳播的所有操作的關係要素。這意味着當你刪除合併時,堅持任何......這些操作也在UserJPA實體上執行。

一旦你刪除了這個組,你需要知道誰是這個設想的所有者。在你的情況下,關係的所有者是UserJPA,這意味着所有更新應該通過所有者進行。

一旦級聯被刪除,你需要實現它看起來像這樣使用側的方法:

removeFromGroup(Group group) { 
    user.getGroups().remove(group); 
    groups.removeUser(this); 
} 

這是爲了確保集合是同步的。

+0

感謝您的評論。我已經嘗試刪除CascadeType.ALL,並且當我嘗試刪除一個組時,我得到一個約束異常,因爲我正在刪除一個組,但是我沒有刪除連接表中的關於條目。但至少,刪除CascadeType.ALL,可以防止我刪除用戶的情況,並且從用戶列表中刪除組仍然可以正常工作。 – Perimosh