2011-08-16 16 views
0

私は2つのクラスForecastCostを持っていて、それらの間に多対多関係が定義されています。リンクテーブルに「オーダー」列を追加しました(Forecast以内にCostの注文を指定できるようになりました)。これをマッピングに反映させるために、新しいエンティティForecastCostを作成し、ForecastCostとの間の置換をForecast 1-* -1 Costに置き換えました。"オブジェクトは未保存の一時的なインスタンスを参照します"

マッピングは次のようになります。

Forecast.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="FinRep" assembly="FinRep"> 
    <class name="Forecast" table="FORECAST" polymorphism="implicit"> 
    <id name="Id" column="PKFORECAST" type="long" access="field.camelcase" unsaved-value="0"><!-- ... --></id> 

    <!-- ... --> 

    <bag name="KostComponenten" table="FORECASTCOST" access="field.camelcase" lazy="false" cascade="save-update"> 
     <key column="FKFRBFORECAST"></key> 
     <one-to-many class="ForecastCost" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

ForecastCost.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="FinRep" assembly="FinRep"> 
    <class name="ForecastCost" table="FORECASTCOST"> 
     <composite-id name="ForecastCostId" class="FinRep.ForecastCostKey, FinRep"> 
      <key-many-to-one name="Forecast" column="FKFORECAST" lazy="false" class="FinRep.Forecast, FinRep" /> 
      <key-many-to-one name="Cost" column="FKCOST" lazy="false" class="FinRep.Cost, FinRep" /> 
     </composite-id> 

     <property name="Order" column="ORDER" /> 
    </class> 
</hibernate-mapping> 

まず、 'カスケード' Forecastのバッグのプロパティが設定されていないため、ForecastにはCostがリンクされていましたが、適切なForecastCostオブジェクトをデータベースから取得できないというエラーが表示されます。私は 'カスケード'プロパティを追加すると、それを修正すると思ったが、今はForecast#1(例えば)を保存しようとすると、タイプ=予測エンティティ= 1のobject references an unsaved transient instance - save the transient instance before flushingという例外が出る。何が起こっていると思い

は、それがForecaseを保存しよう、そうすることによって、それはまた、それにリンクされているすべてのForecastCost/Costオブジェクトを永続化しようとしますが、ForecastCostオブジェクトはまた戻っForecastエンティティへのリンクを持っているということです私たちは節約していますが(まだ保存されておらず、一時的に保存されていないので)、エラーが発生します。

これを解決するにはどうすればよいですか?

+0

何かに私はちょうど発見 - 使用しているとき私はエラーを取得します'SaveOrUpdateCopy'。 'SaveOrUpdate'を使うときは、全て正常です。 – efdee

答えて

0

あなたが持っていたクラスに滞在できるようにするもう1つの方法。

class ForeCast 
{ 
    // public virtual ICollection<Kost> KostComponenten { get; set; } // old 
    public virtual IList<Kost> KostComponenten { get; set; }   // new 
} 

し、それをマップ:その後、順序が一覧にある

<list name="KostComponenten" table="FORECASTCOST" access="field.camelcase" lazy="false" cascade="save-update"> 
    <key column="FKFRBFORECAST"/> 
    <index column="order"/> 
    <many-to-many class="ForecastCost" /> 
</bag> 

を、あなたはKostComponenten.Insert(...)KostComponenten.Add(...)とを行うことができますので、

+0

それは私の元々の計画でしたが、NHibernateは順序シーケンス(例えば1,2,4,5)にギャップがあるときや重複(0、0、0)があるときにうまく反応しません。私は簡単にクライアント側で注文するときに解決することができます... – efdee

+0

@efdeeどのように注文を維持していますか? IListの_add_、_insert_、_remove_を使用すると、0,0,0でなくてはならず、ギャップは単にリストのnullポインタとして扱われます – Firo

+0

最初に、データベースにはすでに多くのエントリがあります。デフォルトでは、その順序は次のように設定されます。 0の場合は、これだけで問題になります。第二に、私は、削除を(インデックスを修正するために)他のすべての行への更新となるようにしたくありません。私のユースケースは現実的ではありません。 – efdee

関連する問題