@ManyToMany with cascade = CascadeType.REMOVE 删除关联和实体

Ple*_*mor 6 java many-to-many hibernate jpa cascade

我有 2 个实体:GroupGrouped,有 1 个多对多关联。

在数据库中,该Association表在Group和上都有一个 NOT NULL FK Grouped

我希望 Hibernate 在删除所有分组时删除关联但不删除组。

删除Grouped实体的代码:

@Autowired
private final GroupedRepository groupedRepository;

public void delete(Grouped groupedToRemove) {
    groupedRepository.delete(groupedToRemove);
}
Run Code Online (Sandbox Code Playgroud)

如果我设置cascade = CascadeType.ALLcascade = CascadeType.REMOVEGroup当我删除一个Grouped实体时,我的实体将被删除,而不仅仅是关联:

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

如果我删除级联,hibernate 会尝试设置 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<>();
}
Run Code Online (Sandbox Code Playgroud)

分组实体:

@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<>();
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

这是预期的行为。REMOVE 级联的意思是:在移除这个实体的同时,也移除关联的实体。这对 ManyToXxx 毫无意义,因为显然,其他实体仍在引用关联实体。

如果要删除 Grouped,但将关联的 Groups 保留在那里,则需要先删除两个实体之间的关联:

for (Group group : grouped.getGroups()) {
    group.getGrouped().remove(grouped);
}
grouped.getGroups().clear();
Run Code Online (Sandbox Code Playgroud)

然后删除不再与任何组关联的 Grouped 实体。