当我试图在一个名为“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”
那么,有什么问题吗?我想尽一切办法解决这个问题。谢谢你的帮助。
1条答案
按热度按时间izj3ouym1#
如果
address
记录的所有者指向user
表,然后使用id=1
必须是至少1年的所有者address
,因此删除用户将使这些地址记录成为孤立的。你有两个选择来处理这种情况:
在删除用户之前,您需要验证该用户是否是任何地址的所有者,如果是,则拒绝删除,或者将该用户作为这些地址的所有者删除。我推荐这个选项,因为它可以让您对整个过程进行最大程度的控制。
您可以定义所有者与
on delete cascade
选项,这将导致在删除用户时删除给定用户拥有的地址。由于用户和地址之间存在另一种关系,因此我不会使用此解决方案,因为删除一个用户可能会导致地址和其他用户的链删除。