hibernate save

时间:2017-03-22 15:42:18

标签: java mysql hibernate spring-mvc

我有一个报告实体,用一个数字(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_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的数量)未更新且等于零。即使通过下一个代码,数字也为零:

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

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

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

1 个答案:

答案 0 :(得分:0)

使用@EmbeddedId复合键无法生成值。 Embeddables是指赋值,因此这里忽略@GeneratedValue的使用。