我有一個報告實體,它是用一個數字(auto_increment)和一個索引來標識的。我有另一個具有相同標識符的實體Flyleaf,並且有一對一的關聯兩個實體之間((number,index)是flyleaf表中的外鍵)。我的代碼是:綜合Id dosen't休眠後保存
public class ReportPK implements Serializable {
@GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(name="num")
private int num;
@Basic(optional = false)
@Column(name="report_index")
private String index;
...(getters, setters, equals and hashCode)
}
@Entity
@Table(name="report")
public class Report {
@EmbeddedId
private ReportPK id;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({
@JoinColumn(name="num", referencedColumnName="num"),
@JoinColumn(name="report_index", referencedColumnName="report_index"),
})
private Flyleaf flyleaf;
...
}
@Entity
@Table(name="flyleaf")
public class Flyleaf implements Serializable{
@EmbeddedId
private ReportPK id;
...
}
當我保存的報告,沒有設定其相關的扉頁,代碼工作,該報告被添加到數據庫中。但是,當我嘗試使用下一代碼保存flyleaf時,將拋出此異常「com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:無法添加或更新子行:外鍵約束失敗(lgmi_cr
。flyleaf
,CONSTRAINT flyleaf_ibfk_1
外鍵(num
,report_index
)參考文獻report
(num
,report_index
))。
Session session = getCurrentSession();
Report report = new Report();
ReportPK rpk = new ReportPK();
rpk.setIndex("A");
report.setId(rpk);
session.save (report);
//if I stop here the code works good and the num is auto_incremented in the data table
Flyleaf flyleaf = new Flyleaf();
flyleaf.setId(report.getId());
report.setFlyleaf(flyleaf);
我發現原因是,保存報告後,其數量ReportPK的(NUM)不更新,這是等於零,即使通過下一個代碼,該數字也是零:
ReportPK pk = (ReportPK) session.save(report);
pk.getNum();
如果有人能幫助我,告訴我問題在哪裏,我會感激。
注:我使用的是MySQL數據庫和Spring框架
[如何從hibernate中的複合主鍵獲取自動生成的值]可能的重複(http://stackoverflow.com/questions/30592497/how-to-get-auto-generated-value-from-composite-primary -key-in-hibernate) – Naros