hibernate - 连接表记录删除时违反参照完整性约束

标签 hibernate jpa spring-data-jpa

用户和组之间存在多对多关系。

@Entity
class User {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = 'id.user')
    Set<GroupMembership> memberships
}

@Entity
class Group {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = 'id.group')
    Set<GroupMembership> members
}

@Entity
class GroupMembership {

    @Embeddable
    static class IdKey implements Serializable {

        @ManyToOne
        @JoinColumn(name = 'userId')
        User user

        @ManyToOne
        @JoinColumn(name = 'groupId')
        Group group
    }

    @EmbeddedId
    IdKey id = new IdKey()
}

我希望能够删除用户或组,并删除任何关联的组成员资格。但是,当我尝试删除用户或组时,我得到:

org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_96K9TDEV9PO6Q3ISOYIJPWAQU: PUBLIC.GROUP_MEMBERSHIPS FOREIGN KEY(GROUP_ID) REFERENCES PUBLIC.GROUP(ID) (1)"; SQL statement:
delete from group where id=? [23503-186]

我正在使用 Hibernate 4.3.8 和 Spring Data JPA 1.7.2。

最佳答案

当然,尽管我花了几个小时寻找答案,但我在发布这个问题后一个小时内就找到了答案。

添加 Hibernate 实现特定的 @OnDelete 注释似乎可以修复它。显然,@OneToMany 上的级联属性仅影响 EntityManager,而不会使其进入生成的 DDL。

@Entity
class Group {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = 'id.group')
    @OnDelete(action = OnDeleteAction.CASCADE)
    Set<GroupMembership> members
}

关于hibernate - 连接表记录删除时违反参照完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30204640/

相关文章:

java - 如何在其他实体中映射同一列两次

hibernate - 为什么 JPA 中 @SequenceGenerator 注释的默认 allocationSize 属性是 50?

java - JPA2/Hibernate - 即时创建模式(即无需手动预先创建模式)?

java - org.hibernate.propertyvalueexception not-null 属性引用 null

java - 当我们在 Spring Boot 中使用 JPA Repository 时,List<Object> 默认大小是多少?

java - 一个数据库中的表可以为不同数据库中的另一个表声明一对多声明吗

java - Spring Boot - Hibernate SessionFactory 的句柄

java - 带有 postgresql 的串行列上的 Spring Data JPA "null value in column xxx violates not-null constraint"

sql - JPA 映射的父实体返回与子实体相同数量的多次

Spring Data Rest 和 Hateoas