Как мне сопоставить непосредственную связь с NHibernate, используя генератор внешних ключей? - PullRequest
0 голосов
/ 22 января 2009

Пока что связь работает нормально (класс User загружает соответствующий экземпляр UserRoles, когда он присутствует), но при создании нового User и установке его свойства Roles на новый экземпляр UserRoles UserRoles объект не сохранен.

Вот мой сокращенный файл User.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="DistrictObservations.User, DistrictObservations" table="users">
    <cache usage="read-write" region="all" />

    <id name="ID" column="id" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>

    <!-- snip -->

    <one-to-one name="Roles" class="DistrictObservations.UserRoles, DistrictObservations" lazy="false" />

  </class>
</hibernate-mapping>

А вот отображение UserRoles:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="DistrictObservations.UserRoles, DistrictObservations" table="user_roles">
    <cache usage="read-write" region="all" />

    <id name="UserID" column="user_id" type="int" >
      <generator class="foreign">
        <param name="property">User</param>
      </generator>
    </id>

    <!-- snip -->

    <one-to-one name="User" class="DistrictObservations.User, DistrictObservations" lazy="false" constrained="true" foreign-key="FK_user_roles_users" />

  </class>
</hibernate-mapping>

Кто-нибудь получил идею, как сохранить объект UserRoles с User.ID в качестве его первичного ключа? Я просматривал документацию, и, честно говоря, она не особенно полезна.

Ответы [ 3 ]

2 голосов
/ 22 января 2009

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

Если вашему приложению требуется только одна роль для каждого пользователя, я предлагаю сразу добавить RoleId в качестве FK в таблицу Users.

При этом, если по какой-то причине вы придерживаетесь отношения один-к-одному, убедитесь, что вы используете inverse = "true" для той, которая не будет обновлять (дочерняя сущность). (См. Документацию Hibernate один к одному для получения дополнительной информации об обратном атрибуте - он должен объяснить об этом достаточно.)

0 голосов
/ 22 января 2009

Я обнаружил, что однозначное сопоставление редко требуется. То, что я часто воспринимаю как один-к-одному, обычно представляет собой отображение один-ко-многим. То же значение, что и первичный ключ в двух таблицах, не является обычным явлением.

Судя по внешнему виду названий классов, кажется, что вы пытаетесь связать роли с пользователем? Для меня это не похоже на один на один.

Тем не менее, похоже, что генератор класса Foreign должен делать то, что вам нужно.

0 голосов
/ 22 января 2009

Я, вероятно, что-то упускаю, но вам нужен один-к-одному между User и UserRoles? Разве вы не можете просто иметь один-ко-многим между пользователем и ролью? Пользовательские роли кажутся избыточными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...