hibernate 3を使用して双方向の親子関係を実装する際に問題が発生しました。この場合の親は、ReportCriteriaクラスです。子供はクラスPkVisitです。私は、以下の基本的なJavaオブジェクトと同様に、私の休止状態の構成ファイルを貼り付けました。Hibernateの双方向親子問題
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リストにすべての要素が含まれます。
ソリューションEDIT:
私の問題は、私は明示的に子供(PkVisits)に親(ReportCriteriaBean)を設定することはなかったということでした。 PkVisitが前にするsaveOrUpdate()の呼び出しに、[OK]を生成する場合
public void setPkVisits(List<PkVisit> pkVisits) {
this.pkVisits = pkVisits;
for(PkVisit visit : pkVisits){
visit.setReportCriteriaBean(this);
}
}
section 21.2あなたはReportCriteriaBeanがnullだったと言っで正しかった、このテーマに関する休止状態のドキュメントへのリンクですが、方法のためPkVisitsのリストは、それ自体で、この追加機能を設定されていたましたうまくいかない。元の投稿を編集して、私が行った正確な変更を示しています。ありがとう! – TimmyJ