То, что является корректным способом определить many-many отношения в NHibernate для разрешения, удаляет, но избегающий дублирующихся записей

Соответствуйте ему против регулярного выражения.

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 , как заключено в кавычки ниже:

Ре: IsNumeric () пункт в MySQL??
Отправленный: kevinclark ()
Дата: 08 августа 2005 13:01


я соглашаюсь. Вот функция, которую я создал для MySQL 5:

CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+) 


Это допускает дополнительное плюс/знак "минус" вначале, одна дополнительная десятичная точка и остальные числовые цифры.

;


Это допускает дополнительное плюс/знак "минус" вначале, одна дополнительная десятичная точка и остальные числовые цифры.

8
задан Kevin Wilson 23 December 2011 в 20:46
поделиться

2 ответа

Что вам нужно сделать, чтобы ваши сопоставления работали так, как вы ожидали, - это переместить inverse = "true" из категории .Items в коллекцию Item.Categories . Сделав это, вы заставите NHibernate понять, какая из сторон является владельцем ассоциации, а это будет сторона «Категория».

Если вы сделаете это, удалив объект «Категория», он удалит соответствующую запись из таблицы поиска, как вы хотите, поскольку это разрешено, потому что это сторона-владелец ассоциации.

По порядку. чтобы НЕ удалять элементы, назначенные объекту категории, который должен быть удален, вам необходимо оставить атрибут каскада следующим образом: cascade = "save-update" .

cascade = "all" Ваши сопоставления должны выглядеть так:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="..."
                   namespace="...">

  <class name="Category" lazy="true">

    <id name="CategoryId" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" />

    <bag name="ItemCategories" generic="true" inverse="true" lazy="true" cascade="none">
        <key column="CategoryId"/>
        <one-to-many class="ItemCategory"/>
    </bag>

    <bag name="Items" table="ItemCategory" cascade="save-update" generic="true">
      <key column="CategoryId"></key>
      <many-to-many class="Item" column="ItemId"></many-to-many>
    </bag>

  </class>

</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="..."
                   namespace="...">

  <class name="Item" table="Item" lazy="true">

    <id name="ItemId" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" />

    <bag name="ItemCategories" generic="true" inverse="true" lazy="true" cascade="all-delete-orphan">
        <key column="ItemId"/>
    <one-to-many class="ItemCategory"/>
    </bag>

    <bag name="Categories" table="ItemCategory" inverse="true" cascade="save-update" generic="true">
      <key column="ItemId"></key>
      <many-to-many class="Category" column="CategoryId"></many-to-many>
    </bag>

  </class>

</hibernate-mapping>

Как указано выше, оно позволяет вам следующее:

  1. Удалить категорию и удалить только запись в таблице ассоциаций, не удаляя ни один из элементов
  2. Удалить элемент и только удалить запись в таблице ассоциаций без удаления какой-либо из категорий
  3. Сохранить с каскадом только со стороны категории, заполнив коллекцию Category.Items и сохранив категорию.
  4. Поскольку inverse = true необходимо в Item.Categories нет способа выполнить каскадное сохранение с этой стороны. Заполнив коллекцию Item.Categories и затем сохранив объект Item, вы получите вставку в таблицу элементов и вставку в таблицу категорий, но не вставку в таблицу ассоциаций. Я предполагаю, что именно так работает NHibernate, и я еще не нашел способа обойти это. Вам нужно будет создать файл сопоставления классов ItemCategory и класс, чтобы все это работало.

10
ответ дан 5 December 2019 в 15:24
поделиться

Вы синхронизируете коллекции? Я считаю, что Hibernate ожидает от вас правильного графа объектов; если вы удалите запись из Item.Categories, я думаю, вам придется удалить ту же запись из Category.Items, чтобы две коллекции синхронизировались.

1
ответ дан 5 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: