持久性异常外键约束在休眠中失败
Persistence Exception foreign key contraint fails in hibernate
我在hibernate中定义了下面两个类
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
}
@Entity
public class PhoneNumber {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne(cascade = CascadeType.ALL)
private Person person;
}
当我坚持一个 phone 数字对象或一个人对象时,它被正确插入。
但是当我这样做时
Person person = session.get(Person.class,1);
session.remove(person);
transaction.commit();
我得到外键违规异常。但是既然我已经声明了一个列为 ManyToOne 不应该休眠自动删除相应的 phonnumber 记录?
我不确定我是否需要添加任何额外的代码来做到这一点
您有 bi-directional 关系,这就是为什么您也必须在 Person
中添加 PhoneNumber
。并用mappedBy
属性表示Person
是反面,每次删除时,请将每个phone号也删除。
像这样:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy="person", cascade = CascadeType.ALL)
private Set<PhoneNumber> phoneNumbers;
}
查看 this 了解更多信息。
首先你要在类.
中定义Person和PhoneNumber的关系
抛出错误是因为有 phone 个数字取决于您删除的人物对象。
如果您添加 @OneToMany
,您还可以定义 属性 cascade = CascadeType.ALL
,然后所有 phone 数字将因此被删除。
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
private List<PhoneNumber> phoneNumbers;
}
@Entity
public class PhoneNumber {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne
private Person person;
}
我在hibernate中定义了下面两个类
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
}
@Entity
public class PhoneNumber {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne(cascade = CascadeType.ALL)
private Person person;
}
当我坚持一个 phone 数字对象或一个人对象时,它被正确插入。
但是当我这样做时
Person person = session.get(Person.class,1);
session.remove(person);
transaction.commit();
我得到外键违规异常。但是既然我已经声明了一个列为 ManyToOne 不应该休眠自动删除相应的 phonnumber 记录?
我不确定我是否需要添加任何额外的代码来做到这一点
您有 bi-directional 关系,这就是为什么您也必须在 Person
中添加 PhoneNumber
。并用mappedBy
属性表示Person
是反面,每次删除时,请将每个phone号也删除。
像这样:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy="person", cascade = CascadeType.ALL)
private Set<PhoneNumber> phoneNumbers;
}
查看 this 了解更多信息。
首先你要在类.
中定义Person和PhoneNumber的关系 抛出错误是因为有 phone 个数字取决于您删除的人物对象。
如果您添加 @OneToMany
,您还可以定义 属性 cascade = CascadeType.ALL
,然后所有 phone 数字将因此被删除。
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
private List<PhoneNumber> phoneNumbers;
}
@Entity
public class PhoneNumber {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne
private Person person;
}