Hibernate問題
昨天做Hibernate一對一關係映射中遇到如下異常:
Cannot add or update a child row: a foreign key constraint fails (`hibernate`.`student`, CONSTRAINT `FK_n4ra8kk0v0g99fi7j4ar69ntu` FOREIGN KEY (`idcard_id`) REFERENCES `Idcard` (`id`))
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement
這個異常折磨了我幾個小時,後來分析發現是因爲被關聯表的主鍵在Hibernate配置文件中沒有設置爲自增,所以該主鍵爲0,外鍵值找不到正確值,所以報該異常,下面附上代碼。
@Entity
public class Student {
private int id;
private String name;
private Idcard idcard;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "idcard_id",unique = true)
public Idcard getIdcard() {
return idcard;
}
public void setIdcard(Idcard idcard) {
this.idcard = idcard;
}
}
@Entity
public class Idcard {
private int id;
private String num;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
}
//測試類
public class Annotation {
private static SessionFactory factory;
public static void main(String... args){
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
save();
}
private static void save() {
Idcard idcard= new Idcard();
idcard.setNum("123456");
Student student = new Student();
student.setName("fzd");
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
student.setIdcard(idcard);
session.save(student);
tx.commit();
session.close();
}
}
這樣能 測試成功。
但是如果在Idcard類中將id不設置爲自增,則報上述異常。