私は2つのクラスForecast
とCost
を持っていて、それらの間に多対多関係が定義されています。リンクテーブルに「オーダー」列を追加しました(Forecast
以内にCost
の注文を指定できるようになりました)。これをマッピングに反映させるために、新しいエンティティForecastCost
を作成し、Forecast
とCost
との間の置換を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
エンティティへのリンクを持っているということです私たちは節約していますが(まだ保存されておらず、一時的に保存されていないので)、エラーが発生します。
これを解決するにはどうすればよいですか?
何かに私はちょうど発見 - 使用しているとき私はエラーを取得します'SaveOrUpdateCopy'。 'SaveOrUpdate'を使うときは、全て正常です。 – efdee