Ple*_*mor 6 java many-to-many hibernate jpa cascade
我有 2 个实体:Group
和Grouped
,有 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.ALL
或cascade = CascadeType.REMOVE
,Group
当我删除一个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)
这是预期的行为。REMOVE 级联的意思是:在移除这个实体的同时,也移除关联的实体。这对 ManyToXxx 毫无意义,因为显然,其他实体仍在引用关联实体。
如果要删除 Grouped,但将关联的 Groups 保留在那里,则需要先删除两个实体之间的关联:
for (Group group : grouped.getGroups()) {
group.getGrouped().remove(grouped);
}
grouped.getGroups().clear();
Run Code Online (Sandbox Code Playgroud)
然后删除不再与任何组关联的 Grouped 实体。
归档时间: |
|
查看次数: |
4178 次 |
最近记录: |