我有两个类Forecast
和Cost
,它们之间定义了多对多关系。我们现在已在链接表中添加了“订单”列(因此我们的客户可以在Cost
内指定Forecast
的订单。为了在我们的映射中反映这一点,我们创建了一个新实体ForecastCost
,并将Forecast
和Cost
之间的多对多替换为Forecast
1- * {{ 1}} * -1 ForecastCost
。
映射看起来像这样:
Forecast.hbm.xml:
Cost
ForecastCost.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>
首先,<?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>
映射中包中的'cascade'属性未设置,因此当我尝试保存与Forecast
链接的Forecast
时,我(理所当然地)得到一个错误,说无法从数据库中检索相关的Cost
对象。我认为添加'cascade'属性可以解决这个问题,但现在当我尝试保存ForecastCost
#1(例如)时,我得到一个异常,说Forecast
类型=预测实体= 1。
我认为正在发生的是它试图保存Forecase,并且通过这样做它还会尝试保留链接到它的所有object references an unsaved transient instance - save the transient instance before flushing
/ ForecastCost
个对象,但是{{1} } object还有一个返回我们正在保存的Cost
实体的链接(但尚未保存,因此是瞬态的),因此它出错了。
我该怎么做才能解决这个问题?
答案 0 :(得分:0)
只是另一种方法,让你留在你的课程。
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(...)
等等