delete导致外键冲突

6fe3ivhb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(539)

当我试图在一个名为“user”的表中挖掘与表“address”相关的行时,我遇到了一个问题。特别是,这是我的用户实体类的一部分

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”时,例如,我的netbeanside返回以下错误
[异常,错误代码30.000,sqlstate 23503]删除表“user”导致违反键(1)上的外键约束“adrsUserId”
那么,有什么问题吗?我想尽一切办法解决这个问题。谢谢你的帮助。

izj3ouym

izj3ouym1#

如果 address 记录的所有者指向 user 表,然后使用 id=1 必须是至少1年的所有者 address ,因此删除用户将使这些地址记录成为孤立的。
你有两个选择来处理这种情况:
在删除用户之前,您需要验证该用户是否是任何地址的所有者,如果是,则拒绝删除,或者将该用户作为这些地址的所有者删除。我推荐这个选项,因为它可以让您对整个过程进行最大程度的控制。
您可以定义所有者与 on delete cascade 选项,这将导致在删除用户时删除给定用户拥有的地址。由于用户和地址之间存在另一种关系,因此我不会使用此解决方案,因为删除一个用户可能会导致地址和其他用户的链删除。

相关问题