@ManyToMany级联= CascadeType.REMOVE删除关联和实体 [英] @ManyToMany with cascade = CascadeType.REMOVE removes associations AND entities
问题描述
我有2个实体: Group
和分组,其中1个ManyToMany关联。在数据库中,
关联
表在组中都有一个NOT NULL FK。 / code>和
分组
。
我想让Hibernate删除关联,但不是删除分组实体的代码:
@Autowired
private final GroupedRepository groupedRepository;
public void delete(grouped groupedToRemove){
groupedRepository.delete(groupedToRemove);如果我将 cascade = CascadeType.ALL
code>或 cascade = CascadeType.REMOVE
,我的 Group
实体被删除,当我删除分组
实体,不仅是关联:
$ b
@ ManyToMany(cascade = CascadeType.ALL,//与CascadeType.REMOVE相同的行为
mappedBy =分组,
targetEntity = Group.class)
私人设置< 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> groupped = new HashSet<>();
分组实体:
< pre-class =lang-java prettyprint-override> @Entity
@Table(name =grouped)
@Getter
@Setter
public class分组{b
$ b @Id
@GeneratedValue(strategy = GenerationType.AUTO)
私有整数id;
@ManyToMany(mappedBy =groupped,targetEntity = Group.class)
private Set< Group> groups = new HashSet<>();
}
解决方案这是预期的行为。删除级联意味着:删除此实体时,还要删除关联的实体。在ManyToXxx上没有任何意义,因为很明显,其他实体仍在引用相关实体。
如果您想要删除一个分组,但将关联的组留在那里,您需要先删除两个实体之间的关联:
for(Group group:grouped.getGroups()){
group.getGrouped()。remove(grouped);
}
grouped.getGroups()。clear();
,然后删除与任何组无关的分组实体。
I have 2 entities: Group
and Grouped
, with 1 ManyToMany association.
In database, the Association
table has a NOT NULL FK on both Group
and Grouped
.
I want Hibernate to delete the association but not the group when all grouped are deleted.
Code to delete a Grouped
entity:
@Autowired
private final GroupedRepository groupedRepository;
public void delete(Grouped groupedToRemove) {
groupedRepository.delete(groupedToRemove);
}
If I set cascade = CascadeType.ALL
or cascade = CascadeType.REMOVE
, my Group
entities are deleted when I delete a Grouped
entity, not only the associations:
@ManyToMany(cascade = CascadeType.ALL, // same behavior with CascadeType.REMOVE
mappedBy = "grouped",
targetEntity = Group.class)
private Set<Group> groups = new HashSet<>();
If I remove the cascade, hibernate tries to set group_id=null and it throws a ModelConstraintException
. I don't want to set the FK as nullable.
Group entity:
@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<>();
}
Grouped entity:
@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<>();
}
解决方案 That's the expected behavior. REMOVE cascading means: when removing this entity, also remove the associated entities. It makes no sense on a ManyToXxx, since obviously, other entities are still referencing the associated entity.
If you want to delete a Grouped, but leave the associated Groups there, you need to remove the association between the two entities first:
for (Group group : grouped.getGroups()) {
group.getGrouped().remove(grouped);
}
grouped.getGroups().clear();
and then remove the Grouped entity, which is not associated to any Group anymore.
这篇关于@ManyToMany级联= CascadeType.REMOVE删除关联和实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!