NHibernate - как обеспечить уникальность? - PullRequest
1 голос
/ 19 июня 2009

Мой сценарий выглядит следующим образом:

  • У меня есть несколько объектов (сообщений), которые можно пометить
  • Итак, у меня есть сущность Tag и отношение многие ко многим
  • Выше сделано и работает
  • Теперь при тегировании я хотел бы сохранять новые теги, только если они не существуют (где существование проверяется заголовком тега)
  • если тег уже существует, я бы хотел, чтобы он распознавался и прикреплялся к моему объекту, а не к новому

Какой самый простой / чистый способ сделать это?

Кстати, по некоторым причинам я хотел бы использовать искусственный первичный ключ (числовой идентификатор) для своей сущности Tag.

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 июня 2009

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

Единственный способ применить правило в вашем вопросе - через код. Последовательность задач будет выглядеть примерно так:

  1. Анализировать введенный пользователем список тегов в отдельные теги
  2. Цикл по тегам ...

    а. Если тег существует, добавьте его в коллекцию тегов объекта

    б. В противном случае создайте новый тег и добавьте его в коллекцию тегов объекта

  3. Персистирующий объект

Вам нужно будет добавить логику для поиска существующих тегов с учетом орфографических ошибок, заглавных букв и альтернативного использования. Например, вы не хотите иметь теги, которые означают, что они одинаковы, но не являются одинаковыми строками, такими как «ASPNET» или «ASP.NET» или «asp.net». Качество вашего списка тегов будет зависеть от того, насколько надежен код, который проверяет существующие теги.

0 голосов
/ 19 июня 2009

Просто для пояснения - тег можно закрепить на многих объектах, а объект может иметь много тегов. Вот что для меня значит отношение многих ко многим. Ты так это имеешь в виду?

Когда вы делаете это в SQL, у вас есть таблицы с именами TAG и OBJECT и таблица соединений с именем TAG_OBJECT, которая содержит два столбца, по одному для каждого первичного ключа в других таблицах. Первичным ключом в таблице соединений TAG_OBJECT является пара (TAG_ID, OBJECT_ID). Это гарантирует уникальное соединение для каждой строки.

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

Я думаю, что Hibernate будет обрабатывать ваше «только если он не существует», если вы напишите хороший метод для определения «глубокого равенства» между двумя экземплярами Tag.

Вы также должны добавить уникальное ограничение к атрибуту заголовка тега. Вот пример, который не совсем соответствует вашим потребностям, потому что это Java и XML, но, возможно, этой подсказки будет достаточно, чтобы указать вам, где искать NHibernate:

<element column="serialNumber" type="long" not-null="true" unique="true"/>

В вашем случае столбец будет заголовком тега, тип - строка, а остальные флаги останутся такими же, как в примере.

...