当我尝试删除与表“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 地址
,因此删除用户将使这些地址记录成为孤立记录。
您有两种选择来处理这种情况:
在删除用户之前,您需要验证该用户是否是任何地址的所有者,如果是,则拒绝删除,或者删除该用户作为这些地址的所有者的身份。我推荐此选项,因为它可以让您最大程度地控制流程。
您可以使用
删除级联
选项定义所有者关系,这将导致在您删除用户时删除给定用户所属的地址。由于用户和地址之间存在另一种关系,因此我不会使用此解决方案,因为删除用户可能会导致地址和其他用户的链式删除。
关于java - 表 'USER' 上的 DELETE 导致外键违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105132/