web-dev-qa-db-ja.com

NHibernateオブジェクトが保存されていない一時インスタンスを参照しているため、フラッシュする前に一時インスタンスを保存してください

内部に多くの参照要素が含まれる複雑なオブジェクトを保存しようとしていますが、ほとんどの場合、完全に機能します。
ただし、以下の例外が発生する場合もありますが、

オブジェクトが保存されていない一時インスタンスを参照しています-フラッシュする前に一時インスタンスを保存するか、プロパティのカスケードアクションを自動保存するものに設定してください。タイプ:Namespace.Core.Client.ClientDetails、エンティティ:Namespace.Core.Client.ClientDetails

問題は、保存しようとしている複雑なオブジェクト内に約12のClientDetails要素があることです。この問題の原因となったオブジェクトインスタンスを特定する方法はありますか? NHibernateロギングまたは他の方法で?以下のように保存するために使用した私のコードサンプル、

_repository.Save<SuperParent>(obj);
_repository.Flush();

Nhibernate show_sqlをtrueに設定すると、正しく生成されたすべてのクエリを確認できますが、フラッシュが呼び出されると、例外がスローされます。

問題の解決にご協力ください。

16
Naganathan

例外は、このオブジェクトによって参照されるClientDetailsの保存されていないインスタンスがあることを意味します。親を保存する前に手動で保存する必要があります

session.Save(Parent.SomeDetail);

またはセットCascade.SaveOrUpdate親マッピングのreference-mappingsで。

16
Firo

注意深く読んだ場合:

...フラッシュする前の一時的なインスタンス、またはカスケードアクションを設定プロパティを自動保存するものに変更

したがって、次のようにして、カスケードをリファレンスに追加できます。

References(x => x.ClientDetails).Cascade.All().Column("ClientDetailsId")
                  .Not.Nullable();  //Or nullable, this depends on your schedule
3
BrennQuin

cascade all changesへのマッピングを編集します。多数のClientDetailsを持つクライアントクラスがある場合、xmlマッピングは次のようになります。

Client.hbm.xmlファイルには、次のものが必要です。

<set name = "ClientDetails" table = "`ClientDetail`" cascade = "all-delete-Orphan" inverse="true"> 
         <key column = "ClientId"/> 
         <one-to-many class = "ClientDetail"/> 
</set>

ClientDetail.hbm.xmlファイルには、次のものが必要です。

<many-to-one name = "Client" class = "Client" column = "ClientId " />
1

このエラーは、参照データである子を含む複雑なオブジェクトがある場合にも発生します(ClientTypeクラスを考えてください)。子のマッピングファイルにバージョン要素があり、データベースのint列にマップする場合、既存の行のバージョン番号を0に設定しないでください。Nhibernateはこれをカスケード更新に挿入されるオブジェクトとして解釈し、すでに存在する行を挿入しようとしているため失敗します。

0
Michael Todd