Hibernate双向父/子问题

我在使用hibernate 3实现双向父/子关系时遇到问题。在这种情况下,父类是ReportCriteria类。 这个孩子属于PkVisitclass。 我已经粘贴了我的hibernate配置文件以及下面的底层java对象。

ReportCriteria配置:

           

ReportCriteria bean:

 public class ReportCriteriaBean { private Integer id; private List pkVisits = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(PkVisit.class)); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public List getPkVisits() { return pkVisits; } public void setPkVisits(List pkVisits) { this.pkVisits = pkVisits; } } 

PkVisit配置:

          

PkVisit Bean:

 public class PkVisit { private Integer id; private ReportCriteriaBean reportCriteriaBean; private Integer week; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public ReportCriteriaBean getReportCriteriaBean() { return reportCriteriaBean; } public void setReportCriteriaBean(ReportCriteriaBean reportCriteriaBean) { this.reportCriteriaBean = reportCriteriaBean; } public Integer getWeek() { return week; } public void setWeek(Integer week) { this.week = week; } } 

当我尝试保存ReportCriteria的实例时会出现问题,由于级联也应该保存任何子PkVisits。 但是,使用时调用save

 hibernateTemplate.saveOrUpdate(reportCriteria); 

生成以下错误:

 org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: org.fstrf.masterpk.domain.PkVisit.reportCriteriaBean; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: org.fstrf.masterpk.domain.PkVisit.reportCriteriaBean 

当我保存不包含PkVisits的报告条件时,一切都按预期工作,但只要任何元素都在ReportCriteria bean的pkVisits列表中,就会发生错误。

解决方案编辑:

我的问题是我从未在子代(PkVisits)中明确设置父(ReportCriteriaBean)。 我通过以下方式编辑我的PkVisits setter来解决问题:

 public void setPkVisits(List pkVisits) { this.pkVisits = pkVisits; for(PkVisit visit : pkVisits){ visit.setReportCriteriaBean(this); } } 

您似乎没有正确地在java中创建双向链接。 我建议在ReportCriteriaBean上创建一个add方法; 有效的东西:

 public boolean add(PkVisit pkVisit) { boolean added = false; added = getPkVisits().add(pkVisit); if (added) { pkVisit.setReportCriteriaBean(this); } return added; } 

该错误表示如果其ReportCriteriaBean为null,则无法保存PkVisit。 我认为上面的代码是你缺失的链接。 如果你走这条路线,你只需要在保持报告标准之前将PkVisit添加到ReportCriteriaBean,一切都应该很好。

另外,这里是关于这个主题的hibernate文档的链接, 第21.2节

在saveOrUpdate()调用之前检查PkVisit是否生成正常。

然后,您可能需要在没有hibernate会话的情况下访问它们之前,先获取有hibernate会话的reportCriteriaBean / pkVisits:

 Hibernate.initialize(reportCriteriaBean.getPkVisits());