gpt4 book ai didi

java - hibernate 保存后复合 ID 不会改变

转载 作者:行者123 更新时间:2023-11-29 19:12:46 30 4
gpt4 key购买 nike

我有一个用数字(自动增量)和索引标识的报告实体。我有另一个具有相同标识符的实体 Flyleaf,并且两个实体之间存在一对一关联((数字,索引) ) 是 Fl​​yleaf 表中的外键 )。我的代码是:

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 外键(numreport_index)引用报告 (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);

我发现原因是保存报表后,其编号(num of ReportPK)没有更新,等于0。即使通过下一个代码,数字也为零:

ReportPK pk = (ReportPK) session.save(report);
pk.getNum();

如果有人可以帮助我并告诉我问题出在哪里,我将不胜感激。

注意:我使用 MySQL 数据库和 spring 框架

最佳答案

无法使用 @EmbeddedId 复合键生成值。 Embeddables 旨在被赋值,因此这里忽略 @GenerateValue 的使用。

关于java - hibernate 保存后复合 ID 不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956410/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com