Возврат «объекта ссылается на несохраненный временный экземпляр» - PullRequest
0 голосов
/ 16 августа 2011

У меня было 2 класса, Forecast и Cost, между которыми определено отношение «многие ко многим».Теперь мы добавили столбец «Заказ» в таблицу ссылок (чтобы наши клиенты могли указать заказ Cost с в пределах Forecast).Чтобы отразить это в нашем отображении, мы создали новую сущность ForecastCost и заменили многие-ко-многим между Forecast и Cost на 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 sЯ бы (по праву так) получил сообщение о том, что соответствующие объекты ForecastCost не могут быть извлечены из базы данных.Я думал, что добавление свойства 'cascade' исправит это, но теперь, когда я пытаюсь сохранить Forecast # 1 (например), я получаю исключение, говорящее object references an unsaved transient instance - save the transient instance before flushing с type = Forecast entity = 1.

Я думаю, что происходит, что он пытается сохранить Forecase, и при этом он также пытается сохранить все объекты ForecastCost / Cost, связанные с ним, но объект ForecastCost также имеет ссылку наForecast сущность, которую мы сохраняем (но еще не сохранили, таким образом, являемся переходными), и поэтому она выдает ошибку.

Что мне сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 16 августа 2011

просто еще один подход, который позволит вам остаться с классами, которые у вас были.

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(...) и т. Д.

...