java - 表 'USER' 上的 DELETE 导致外键违规

标签 java mysql jpa entity eclipselink

当我尝试删除与表“ADDRESS”相关的名为“USER”的表中的行时遇到问题。特别是,这是我的 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”发生冲突

那么,问题出在哪里呢?我尝试了一切来解决这个问题。感谢您的帮助。

最佳答案

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

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

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

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

关于java - 表 'USER' 上的 DELETE 导致外键违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105132/

相关文章:

mysql - 计算嵌套选择结果并总结- SQL

java - 如何在 entitymanager createNativeMethod 中回滚

java - 在 Adempiere 的模型类中添加确认(是/否)对话框

java - 设置 Encog EarlyStoppingStrategy 参数的正确方法

Java int 数组随着起点和终点递增

php - 如何在语句执行期间保持临时 mysqli 表在 php 中可用?

mysql - 如何为列中具有重复值的行建立索引?

java - Hibernate中查询继承实体时`Unknown column ' Camera ' in ' where子句`

java - Hibernate 内连接 ManyToOne

java - 获得所有资源的完整释放,如 System.exit(0) 中所示