2017-03-22 45 views
0

我有一個報告實體,它是用一個數字(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_crflyleaf,CONSTRAINT flyleaf_ibfk_1外鍵(numreport_index)參考文獻reportnumreport_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框架

+0

[如何從hibernate中的複合主鍵獲取自動生成的值]可能的重複(http://stackoverflow.com/questions/30592497/how-to-get-auto-generated-value-from-composite-primary -key-in-hibernate) – Naros

回答

0

生成的值是不可能的@EmbeddedId組合鍵。 Embeddables意味着分配值,因此在這裏忽略使用@GeneratedValue

+0

謝謝你的回答。在這種情況下,我的想法是刪除@GeneratedValue註釋,禁用num字段auto_incremented,添加一個字段(讓gen_field)到auto_incremented表(不是主鍵的一部分)。當我想保存報告時,我將num設置爲0並將索引設置爲A,然後我將檢索gen_field的值並使用此值更新報告編號。 這可行嗎? –