2009-07-09 18 views
1

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); 
    } 
} 

答えて

2

あなたが作成していないことが表示されます:あなたは休止状態のセッションを持っていないところ

次に、あなたがそれらにアクセスする前に、あなたはHibernateセッションを持っているreportCriteriaBean/pkVisitsを、フェッチ熱心に必要があるかもしれません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に追加してから、レポート条件を維持してください。

また

、ここ

+0

section 21.2あなたはReportCriteriaBeanがnullだったと言っで正しかった、このテーマに関する休止状態のドキュメントへのリンクですが、方法のためPkVisitsのリストは、それ自体で、この追加機能を設定されていたましたうまくいかない。元の投稿を編集して、私が行った正確な変更を示しています。ありがとう! – TimmyJ

0

チェック:私は、次のように私のPkVisitsセッターを編集することによって、問題を改善しました。

Hibernate.initialize(reportCriteriaBean.getPkVisits()); 
関連する問題