NHibernate сопоставление сущностей один-ко-многим - должен ли ключевой столбец быть обнуляемым? - PullRequest
0 голосов
/ 02 апреля 2011

В книге «Сохранение Java с Hibernate» в разделе «Многозначные ассоциации» приведен пример, в котором родительский объект (Item) содержит список связанных объектов сущности (Bid).Пример приведен на странице 290 в моем издании.

<hibernate-mapping>
  <class name="com.shane.Hibernate1.Item" table="Item">
    <id name="ItemId" column="ItemId">
      <generator class="increment"/>
    </id>

    <property name="Synopsis" column="Synopsis"/>

    <list name="bids" cascade="save-update">
      <key column ="ItemId" not-null="true"/>
      <list-index column="Sequence"/>
      <one-to-many class="com.shane.Hibernate1.Bid"/>
    </list>    
  </class>
</hibernate-mapping>  

<hibernate-mapping>
  <class name="com.shane.Hibernate1.Bid" table="Bid">
    <id name="BidId" column="BidId">
      <generator class="increment"/>
    </id>    
    <property name="synopsis" column="Synopsis"/>
  </class>
</hibernate-mapping>

Я попробовал следующее с NHibernate и 2.1.2.GA и 3.1.0.GA:

 Item item = new Item();
 item.setSynopsis("Item 1");

 Bid bid = new Bid();
 bid.setSynopsis("Bid1");     
 item.getBids().add(bid);

 session.save(item);

NHibernate первые вставкисначала новая строка в Item затем пытается вставить строку в Bid, но завершается неудачно, так как не включает столбцы ItemId и Sequence, если в таблице установлены эти столбцы, не равные NULL.Если я сделаю эти столбцы обнуляемыми, это сработает, потому что затем они обновят Bid, чтобы установить их, но я не хочу, чтобы они обнулялись.

Я попробовал это с помощью Hibernate 3.1.rc2, и это работает - когдавставляет ли он все значения, но, как ни странно, он все равно обновляет ItemId и Sequence в таблице Bid.

Это ошибка в NHibernate?Я ожидаю, что такое поведение fo будет одинаковым как для версий java, так и для .Net.

Ответы [ 3 ]

0 голосов
/ 04 апреля 2011

Я думаю, что класс предметов должен иметь много ссылок на одну.Таким образом, вы должны сохранить пункт.Затем установите ссылку в ставке (bit.setItem (item)) и сохраните ставку.

0 голосов
/ 05 апреля 2011

С NHibernate вам нужны двунаправленные отношения, если вам нужны ненулевые внешние ключи в коллекциях. Прочитайте примечание в конце http://www.nhforge.org/doc/nh/en/index.html#collections-onetomany

Это, безусловно, одно из самых востребованных изменений в NH, которое не обязательно соответствует Hibernate 100% времени; это только основано на этом.


Обновление: это ограничение, к сожалению, фактически делает невозможным сделать это с list.

Обходной путь использует взамен bag или set и отображает индекс как обычное свойство.

0 голосов
/ 04 апреля 2011

Мне кажется, что такое решение ...

Ставка Bid = новая ставка (); session.save (ставка);

Предмет вещь = новый предмет (); item.getBids (). add (new Bid (bid.getBidId ())); session.save (пункт).

где класс In BID () должен иметь один конструктор Parameterized.

Я надеюсь, что это работает нормально ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...