我有一个用数字(auto_increment)和一个索引标识的Report实体,还有另一个具有相同标识符的Flyleaf实体,并且两个实体之间存在一对一的关联((number,index)是一个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时,抛出此异常“ com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败(
lgmi_cr
。,约束flyleaf
外键(flyleaf_ibfk_1
,num
)参考report_index
(report
,num
))。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框架
最佳答案
@EmbeddedId
复合键无法生成值。可嵌入对象是要分配值的,因此在这里忽略@GeneratedValue
的使用。