У меня был такой же случай, как у тебя. У меня был класс конфигурации, который может быть либо глобальной конфигурацией, либо конкретной конфигурацией проекта, либо конкретной конфигурацией пользователя. Что я сделал, это было:
- Я сопоставляю Родителя, как обычно в любом случае, со всеми возможными родителями (кроме глобальных, это означает, что применяется ко всем, поэтому нет родителей)
< class name="ConfigurationDomain" table="configuration">
< property name="ProjectId" column="project_id" type="int" insert="false" update="false" />
< property name="UserId" column="user_id" type="int" insert="false" update="false" />
< many-to-one name="Project" column="project_id" lazy="false" />
< many-to-one name="User" column="estimator_id" lazy="false" />
< /class>
- Я отображаю конфигурацию как коллекцию во всех возможных родителях
< class name="UserDomain" table="user">
< set name="ConfigurationList" lazy="true" cascade="all-delete-orphan">
< key column="user_id" />
< one-to-many class="ConfigurationDomain" />
< /set>
< /class>
< class name="ProjectDomain" table="user">
< set name="ConfigurationList" lazy="true" cascade="all-delete-orphan">
< key column="project_id" />
< one-to-many class="ConfigurationDomain" />
< /set>
< /class>
Просто так, и это сработало для меня. Как мне получить доступ к конфигурации, скажем, пользователя с идентификатором 55 это:
Я не использую someUser.ConfigurationList, поскольку он работает медленно. Я только сопоставляю родителя, чтобы я мог сделать это на HQL (это намного быстрее):
select c from ConfigurationDomain c where c.UserId=55
И чтобы получить глобальную конфигурацию, я бы сделал это:
select c from ConfigurationDomain c where (c.UserId IS NULL) and (c.ProjectId IS NULL)
Если подумать, я думаю, что вы даже можете удалить отображение коллекции, если решите использовать HQL.
ПРИМЕЧАНИЕ: Я использовал Criteria в ранние годы с NHibernate, но потом я обнаружил, что HQL несколько более мощный для меня, другие могут иметь другое мнение по этому поводу.