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

标签 java hibernate jpa many-to-many cascade

我有 2 个实体:GroupGrouped,具有 1 个 ManyToMany 关联。

在数据库中,Association 表在 GroupGrouped 上都有一个 NOT NULL FK。

我希望 Hibernate 在删除所有分组后删除关联而不是组。

删除分组实体的代码:

@Autowired
private final GroupedRepository groupedRepository;

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

如果我设置 cascade = CascadeType.ALLcascade = CascadeType.REMOVE,当我删除 时,我的 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();

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

关于java - @ManyToMany with cascade = CascadeType.REMOVE 删除关联和实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354474/

相关文章:

java - Mac OS X 上的 SWT 菜单不显示

java - 不支持 Project facet Java 1.8 版、Tomcat 9、Eclipse Oxygen

java - 对象类是否也在扩展任何类?

java - 如何注册 SQL 函数,以便您可以使用 JPA 和 Hibernate 在 JPQL 或 HQL 查询中调用它们

hibernate - Spring 数据休息 : "Date is null" query throws an postgres exception

java - JPA HIBERNATE - 将列映射两次(embeddedID 和 POJO)

java - OOP 二十一点游戏(创建牌组)

hibernate - 对于使用 Spring 和 JDBCTemplates、iBatis/myBatis 或 Hibernate 的新项目?

java - 使用 CriteriaBuilder 在数据库中搜索 Long 值

java - Hibernate:没有 id 生成器的缺点?