@ManyToMany with cascade = CascadeType.REMOVE 删除关联和实体
@ManyToMany with cascade = CascadeType.REMOVE removes associations AND entities
我有 2 个实体:Group
和 Grouped
,具有 1 个 ManyToMany 关联。
在数据库中,Association
table 在 Group
和 Grouped
上都有一个 NOT NULL FK。
我希望 Hibernate 在删除所有分组后删除关联而不是组。
删除 Grouped
实体的代码:
@Autowired
private final GroupedRepository groupedRepository;
public void delete(Grouped groupedToRemove) {
groupedRepository.delete(groupedToRemove);
}
如果我设置 cascade = CascadeType.ALL
或 cascade = CascadeType.REMOVE
,当我删除 Grouped
实体时,我的 Group
实体也会被删除,而不仅仅是关联:
@ManyToMany(cascade = CascadeType.ALL, // same behavior with CascadeType.REMOVE
mappedBy = "grouped",
targetEntity = Group.class)
private Set<Group> groups = new HashSet<>();
如果我删除级联,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<>();
}
分组实体:
@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<>();
}
这是预期的行为。 REMOVE级联的意思是:在移除这个实体的同时,也移除关联的实体。它在 ManyToXxx 上没有任何意义,因为很明显,其他实体仍在引用关联的实体。
如果你想删除一个Grouped,但将关联的Groups留在那里,你需要先删除两个实体之间的关联:
for (Group group : grouped.getGroups()) {
group.getGrouped().remove(grouped);
}
grouped.getGroups().clear();
然后删除不再与任何组相关联的分组实体。
我有 2 个实体:Group
和 Grouped
,具有 1 个 ManyToMany 关联。
在数据库中,Association
table 在 Group
和 Grouped
上都有一个 NOT NULL FK。
我希望 Hibernate 在删除所有分组后删除关联而不是组。
删除 Grouped
实体的代码:
@Autowired
private final GroupedRepository groupedRepository;
public void delete(Grouped groupedToRemove) {
groupedRepository.delete(groupedToRemove);
}
如果我设置 cascade = CascadeType.ALL
或 cascade = CascadeType.REMOVE
,当我删除 Grouped
实体时,我的 Group
实体也会被删除,而不仅仅是关联:
@ManyToMany(cascade = CascadeType.ALL, // same behavior with CascadeType.REMOVE
mappedBy = "grouped",
targetEntity = Group.class)
private Set<Group> groups = new HashSet<>();
如果我删除级联,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<>();
}
分组实体:
@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<>();
}
这是预期的行为。 REMOVE级联的意思是:在移除这个实体的同时,也移除关联的实体。它在 ManyToXxx 上没有任何意义,因为很明显,其他实体仍在引用关联的实体。
如果你想删除一个Grouped,但将关联的Groups留在那里,你需要先删除两个实体之间的关联:
for (Group group : grouped.getGroups()) {
group.getGrouped().remove(grouped);
}
grouped.getGroups().clear();
然后删除不再与任何组相关联的分组实体。