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());
- JDBC类型的无Dialect映射:1111
- 检查hibernate映射类中的不变量
- @ElementCollection with Map 其中Entity是Embeddable的一个字段
- 使用join更新值
- org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:*靠近第1行
- 如何在hibernate中使用单个表连接三个表?
- 值’0000-00-00’不能表示为java.sql.Date
- 在Tomcat中设置Hibernate会话工厂
- NoClassDefFoundError:org / hibernate / annotations / common / reflection / MetadataProvider