Просто для пояснения - тег можно закрепить на многих объектах, а объект может иметь много тегов. Вот что для меня значит отношение многих ко многим. Ты так это имеешь в виду?
Когда вы делаете это в 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"/>
В вашем случае столбец будет заголовком тега, тип - строка, а остальные флаги останутся такими же, как в примере.