2011-08-16 50 views
0

我有2个类,ForecastCost,它们之间定义了多对多关系。我们现在在链接表中添加了“订单”列(因此,我们的客户可以在Forecast内指定Cost的订单)。为了在我们的映射中反映出这一点,我们创建了一个新实体ForecastCost并将ForecastCost之间的多对多替换为Forecast 1- * ForecastCost * -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对象不能从数据库中检索。我认为加入'cascade'属性会解决这个问题,但是现在当我尝试保存Forecast#1(例如)时,我得到一个异常,说明类型为= Forecast entity = 1的object references an unsaved transient instance - save the transient instance before flushing

我认为正在发生的事情是,它试图挽救预测如何,并通过这样做,也试图坚持链接到它所有的ForecastCost/Cost对象,但ForecastCost对象也有一个链接回Forecast实体我们正在保存(但还没有保存,因此是暂时的),所以它出错了。

我应该怎么做才能解决这个问题?

+0

东西我刚刚发现 - 使用时,我只能得到错误'SaveOrUpdateCopy'。当使用'SaveOrUpdate'时,一切正常。 – efdee

回答

0

只是另一个让你留在你的课程的aproach。

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,并将空位视为空列表中的空指针 – Firo

+0

首先,我们在数据库中已有很多条目,默认情况下,它们的顺序现在将设置为0,这仅仅是一个问题。其次,我不希望删除导致所有其他行的更新(以修复其索引)。这对我现在的用例来说并不现实。 – efdee

相关问题