2015-09-02 115 views
3

我有2個實體:GroupGrouped,與1 ManyToMany關聯。@ManyToMany cascade = CascadeType.REMOVE刪除關聯和實體

在數據庫中,Association表在GroupGrouped上都有NOT NULL FK。

我希望Hibernate在刪除所有分組時刪除關聯但不刪除組。

代碼刪除Grouped實體:

@Autowired 
private final GroupedRepository groupedRepository; 

public void delete(Grouped groupedToRemove) { 
    groupedRepository.delete(groupedToRemove); 
} 

如果我設置cascade = CascadeType.ALLcascade = CascadeType.REMOVE,當我刪除Grouped實體,不僅協會我Group實體刪除:

@ManyToMany(cascade = CascadeType.ALL, // same behavior with CascadeType.REMOVE 
     mappedBy = "grouped", 
     targetEntity = Group.class) 
private Set<Group> groups = new HashSet<>(); 

如果我刪除級聯,休眠嘗試設置group_id = null並且它會拋出一個ModelConstraintException。我不想將FK設置爲​​空。

集團法人:

@Entity 
@Table(name = "groups") 
@Getter 
@Setter 
public class Group { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @ManyToMany(targetEntity = Grouped.class) 
    @JoinTable(
      name = "association", 
      joinColumns = @JoinColumn(name = "group_id", nullable = false, updatable = false), 
      inverseJoinColumns = @JoinColumn(name = "grouped_id", nullable = false, updatable = false) 
    ) 
    private Set<Grouped> grouped= new HashSet<>(); 
} 

分組實體:

@Entity 
@Table(name = "grouped") 
@Getter 
@Setter 
public class Grouped { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @ManyToMany(mappedBy = "grouped", targetEntity = Group.class) 
    private Set<Group> groups= new HashSet<>(); 
} 

回答

3

這是預期的行爲。刪除級聯意味着:刪除此實體時,還要刪除關聯的實體。對於ManyToXxx來說毫無意義,因爲很明顯,其他實體仍在引用關聯的實體。

如果你想刪除一個分組,但留下相關的羣組,你需要先取消關聯的兩個實體之間:

for (Group group : grouped.getGroups()) { 
    group.getGrouped().remove(grouped); 
} 
grouped.getGroups().clear(); 

然後取出分組實體,這是沒有關聯任何組織了。

+0

發佈兩個實體的代碼,您用於刪除分組的代碼以及異常的完整堆棧跟蹤。 –

+0

是的,它的工作原理,謝謝!因此,重要的是刪除分組實體上的所有對要刪除的實體的引用,而且還要刪除在所有鏈接的組實體上刪除的分組的所有引用。 – Pleymor

+1

這是我的代碼示例。實際上,真正重要的唯一方面是所有者方,這是沒有'mappedBy'屬性的一方。 –