我有一个用数字(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_1num)参考report_indexreportnum))。

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的使用。

10-01 12:14