Вопрос

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

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

  1. Разбить введенный пользователем список тегов на отдельные теги
  2. Перебирайте теги в цикле ...

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

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

  3. Сохраняемый объект

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top