【问题标题】:Foreign keys in ManyToMany Java + Hibernate + MySQLManyToMany Java + Hibernate + MySQL中的外键
【发布时间】:2017-06-20 23:56:40
【问题描述】:

当我尝试在 Hibernate 的帮助下使用其 ID 从角色表中删除角色时,会发生异常:

 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`ewp`.`permissions`, CONSTRAINT `FK_sq51ihfrapwdr98uufenhcocg` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`))

Class User ... @NotNull @ManyToMany(fetch = FetchType.EAGER, targetEntity = Role.class) @JoinTable(name = "permissions", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "role_id")}) private Set<Role> roles; ...

Class Role ... @ManyToMany(fetch = FetchType.EAGER) private List<User> users; ...

当我添加到角色时

@JoinTable(name = "permissions", joinColumns = {@JoinColumn(name = "role_id")}, inverseJoinColumns = {@JoinColumn(name = "user_id")}) private List<User> users;

无一例外地删除角色。 但我认为它可以在没有映射角色的情况下工作。

【问题讨论】:

  • 您是否尝试过在自有端添加 mappedBy? @ManyToMany(fetch = FetchType.EAGER, mappedBy="roles")

标签: java hibernate foreign-keys mapping many-to-many


【解决方案1】:

您要么需要确定多对多的哪一方拥有关系,要么确保在删除关联的Role 对象之前更改双方。

如 cmets 中所述,您可以通过在关系的任一侧添加 mappedBy 属性来暗示所有权。通过将mappedBy="roles" 添加到Role 实体,这将告诉持久性提供者该关系由User 对象的roles 属性管理,因此可以使用其连接表映射来操作该关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多