加入 table 记录删除时违反参照完整性约束
Referential integrity constraint violation on join table record delete
我在用户和组之间有一个多对多的关系。
@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
}
我在用户和组之间有一个多对多的关系。
@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
}