В этом случае вам действительно нужны отношения «многие ко многим»:
<class name="User">
<id name="Id">
<generator class="native">
<param name="sequence">object_sequence</param>
</generator>
</id>
<version name="Version" />
<property name="Name" />
<set name="Roles" table="User_Favourite">
<key column="UserId"/>
<many-to-many column="FavouriteId" class="Favourite"/>
</set>
</class>
И то же самое с другой стороны: (* обратите внимание на обратное = "true")
<class name="Favourite">
<id name="Id">
<generator class="native">
<param name="sequence">object_sequence</param>
</generator>
</id>
<version name="Version" />
<property name="RoleName" />
<set name="Users" table="User_Favourite" inverse="true">
<key column="FavouriteId"/>
<many-to-many column="UserId" class="User"/>
</set>
</class>
Из документации NHibernate 2.0 :
Очень важное примечание : Если столбец <key>
ассоциации <one-to-many>
объявлен NOT NULL
, NHibernate может вызвать нарушения ограничений при создании или обновлении ассоциации. Чтобы предотвратить эту проблему, необходимо использовать двунаправленную ассоциацию с многозначным концом (набором или сумкой), помеченным как inverse="true"
. См. Обсуждение двунаправленных ассоциаций далее в этой главе.
Наконец, я не уверен, действительно ли вы хотите использовать сумку здесь. Один пользователь может иметь одного и того же фаворита два или более раз?
P.S .: Также обратите внимание, что lazy = "true" является поведением по умолчанию, начиная с NHibernate 1.2.