我有一个报告实体,用一个数字(auto_increment)和一个索引来标识。我有另一个实体Flyleaf,它具有相同的标识符,并且两个实体之间存在一对一的关联((数字,索引) )是扉页中的外键)。我的代码是:
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,则代码可以正常工作并将报告添加到数据库中。但是,当我尝试使用下一个代码保存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的数量)未更新且等于零。即使通过下一个代码,数字也为零:
ReportPK pk = (ReportPK) session.save(report);
pk.getNum();
如果有人可以帮助我并告诉我问题在哪里,我会感激不尽。
注意:我正在使用MySQL数据库和spring框架
答案 0 :(得分:0)
使用@EmbeddedId
复合键无法生成值。 Embeddables是指赋值,因此这里忽略@GeneratedValue
的使用。