【问题标题】:DELETE on table 'USER' caused a foreign key violation表 'USER' 上的 DELETE 导致外键违规
【发布时间】:2018-06-14 18:23:01
【问题描述】:

当我尝试删除与表“ADDRESS”相关的名为“USER”的表中的一行时遇到问题。特别是,这是我的用户实体类的一部分

public class User implements Serializable {

  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String username;
  @Column(unique = true)
  private String email;
  private String password;
  @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
  private List<Address> addressList;

这是我的地址实体类的一部分

public class Address implements Serializable {

  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  ...
  private String city;
  @ManyToOne
  private User user;

我使用 EntityManager 来保存我的对象,它运行良好。但是,例如,当我尝试执行“DELETE FROM USER WHERE USER.ID = 1”时,我的 NetBeans IDE 返回给我以下错误

[异常,错误代码 30.000,SQLState 23503] 表 'USER' 上的 DELETE 导致违反键 (1) 上的外键约束 'ADRSSUSERID'

那么,有什么问题吗?我尝试了一切来解决这个问题。谢谢你的帮助。

【问题讨论】:

  • 为什么地址实体中有用户?
  • 一个用户可以有一个或多个地址,这很好。但是为什么要在地址表中引用用户 ID?地址表似乎有一个指向用户表的外键,这没有多大意义,并且会导致错误。
  • 是的,这是因为地址表中有一个“owner_id”,它是User表中“user_id”的外键。
  • 是的,丹,它是这样建模的,因为一个用户可以有多个地址。
  • 在这次谈话之后我不确定我的答案,所以我删除了它,但我有兴趣听到更好的答案。似乎您希望删除用户以级联到其地址。如果地址和用户之间存在多对一关系,该怎么做?密钥必须在地址一侧,对吧?

标签: java mysql jpa entity eclipselink


【解决方案1】:

如果address 记录的所有者指向user 表,则具有id=1 的用户必须是至少1 个address 的所有者,因此删除该用户将使这些地址记录成为孤儿。

您有两种选择来处理这种情况:

  1. 在删除用户之前,您需要验证它是否是任何地址的所有者,如果是则拒绝删除或删除用户作为这些地址的所有者。我会推荐这个选项,因为它可以让您最大程度地控制流程。

  2. 您可以使用on delete cascade 选项定义所有者关系,这将导致在您删除用户时删除给定用户的所有者地址。由于您在用户和地址之间存在另一种关系,因此我不会使用此解决方案,因为删除用户可能会导致地址和其他用户的链式删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多