连接表记录删除时的参照完整性约束违规

Jon*_*son 5 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()
}
Run Code Online (Sandbox Code Playgroud)

我希望能够删除用户或组,并删除任何关联的GroupMembership.但是,当我尝试删除用户或组时,我得到一个:

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]
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*son 7

当然,尽管找了几个小时的答案,但我在发布这个问题的一个小时内就弄明白了.

添加特定于Hibernate实现的@OnDelete注释似乎解决了这个问题.显然@OneToMany上的级联属性仅影响EntityManager,并且不会使其进入生成的DDL.

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

  • @OnDelete 是 hibernate 独有的,这个接缝很丑,难道没有其他合适的解决方案吗? (2认同)