2009-07-09 131 views
1

我有一個問題,使用休眠3實現雙向父/子關係。父,在這種情況下,是類ReportCriteria。孩子是PkVisit班。我粘貼了我的hibernate配置文件以及下面的底層java對象。休眠雙向父/子問題

ReportCriteria配置:

<hibernate-mapping package="org.fstrf.masterpk.domain"> 
<class name="ReportCriteriaBean" table="masterPkReportCriteria"> 

    <id name="id" column="id"> 
     <generator class="org.hibernate.id.IncrementGenerator" /> 
    </id> 

    <bag name="pkVisits" table="masterPkWeeks" cascade="all-delete-orphan" inverse="true"> 
     <key column="runId"/> 
     <one-to-many class="PkVisit"/> 
    </bag> 
</class> 
</hibernate-mapping> 

ReportCriteria豆:

public class ReportCriteriaBean { 

private Integer id; 

private List<PkVisit> pkVisits = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(PkVisit.class)); 

public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 

public List<PkVisit> getPkVisits() { 
    return pkVisits; 
} 

public void setPkVisits(List<PkVisit> pkVisits) { 
    this.pkVisits = pkVisits; 
} 

} 

PkVisit配置:

<hibernate-mapping package="org.fstrf.masterpk.domain"> 
<class name="PkVisit" table="masterPkWeeks"> 
    <id name="id" column="id"> 
     <generator class="org.hibernate.id.IncrementGenerator" /> 
    </id> 

    <many-to-one name="reportCriteriaBean" class="ReportCriteriaBean" column="runid" not-null="true" /> 

    <property name="week" column="week" /> 

</class> 
</hibernate-mapping> 

PkVisit豆:

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。然而,當保存使用

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二傳手通過以下方式糾正的問題:

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

回答

2

看來,你沒有創建在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文檔的鏈接,section 21.2

+0

你在說,ReportCriteriaBean爲空是正確的,但由於方式PkVisits的名單是由自己設定這個附加功能做不行。我編輯了我的原始帖子,以表明我所做的確切更改。謝謝! – TimmyJ 2009-07-09 16:13:26

0

檢查是否已產生PkVisit確定,saveOrUpdate()方法調用之前。

然後,您可能需要預先抓取,你有Hibernate的Session reportCriteriaBean/pkVisits,之前訪問它們,你不用Hibernate的Session:

Hibernate.initialize(reportCriteriaBean.getPkVisits());