問題描述:一個簡單的hibernate應用程序,包含兩個類Journal和Person類,測試多對一,然後報如下錯誤
分析:錯誤字面意思是,保存Person類到數據庫時,其外鍵在對應的表(Journal)不存在。
異常信息如下:
ERROR: Cannot add or update a child row: a foreign key constraint fails (`jpa`.`person`,
CONSTRAINT `FKnu5yg26br1juumnq38hl0a8p8` FOREIGN KEY (`issn`) REFERENCES `journal`
(`issn`))
Journal類如下:
@Entity
@Table(name="JOURNAL")
public class Journal {
@Id
@Column(name="ISSN")
private String issn; //雜誌編號
@Column(name="TITLE")
private String title; //雜誌全名
@Column(name="ISOABBREVIATION")
private String iSOAbbreviation; //雜誌名縮寫
@Column(name="IFSCORE")
private double ifScore; //雜誌影響因子
//methods
}
Person類如下:
@Entity
@Table(name="PERSON")
public class Person {
@Id
@Column(name="ID")
private String id;
@Column(name="NAME")
private String name;
@ManyToOne(targetEntity=Journal.class)
@JoinColumn(name="issn")
private Journal journal;
//methods
}
主函數關鍵代碼:
Journal jn = new Journal("111", "張三", "男", 9.9);
Person p = new Person("222","aaa",jn);
session.save(p);
transaction.commit();
分析原因:試圖通過保存Person的同時,也保存Journal,但是並沒有設置級聯操作。導致插入Person到數據庫時,其外鍵對象Journal並沒有插入,所以報錯,外鍵所指在對應的表裏不存在
解決辦法:
修改Person類部分代碼如下,添加級聯關係:
@ManyToOne(targetEntity=Journal.class,cascade=CascadeType.ALL)
@JoinColumn(name="issn")
private Journal journal;