NHibernate Много-много сопоставлений с дополнительными столбцами в таблице сопоставления - PullRequest
0 голосов
/ 14 июня 2009

Есть две таблицы Person и Address. У меня есть таблица сопоставления PersonAddressMap, которая содержит дополнительный столбец IsCurrent, отличный от двух внешних ключей (без явного столбца первичного ключа). Я создал три класса сопоставления по одному для Person, Address и PersonAddressMap. Мне нужно получить доступ ко всем адресам персоны, а также ко всем персонам, у которых есть конкретный адрес из Address, поэтому у меня есть один-ко-многим для PersonAddressMap в классе Person и Address. Теперь проблема двунаправленного объединения заключается в создании бесконечной петли. Если я удаляю одну из ассоциаций, загрузка работает нормально, но Save не вставляется в таблицу сопоставления (например: если у меня есть только одна связь из Person с PersonAddressMap и я пытаюсь вставить нового Person с новым адресом, тогда только Person вставляя.). Файлы сопоставления выглядят так:

  <class name="Person" table="Person">

    <id name="Id">  
      <column name="Id" sql-type="int" not-null="true" />
      <generator class="identity" />
    </id>
    <property name="Name" column="Name"/>
    <bag name="AddressDetails" table="PersonAddressMap" cascade="all" >
      <key column="PersonId" />
      <one-to-many class="PersonAddressMap" />
    </bag>
  </class>

  <class name="Address" table="Address">

    <id name="Id">  
      <column name="Id" sql-type="int" not-null="true" />
      <generator class="identity" />
    </id>
    <property name="City" column="City"/>
    <bag name="PersonDetails" table="PersonAddressMap" cascade="all" >
      <key column="AddressId" />
      <one-to-many class="PersonAddressMap" />
    </bag>
  </class>

  <class name="Job" table="Job" lazy="false">
    <composite-id>
      <key-many-to-one column="PersonId" name="Person" />
      <key-many-to-one column="AddressId" name="Address" />
    </composite-id>
    <property name="IsCurrent" column="IsCurrent"/>
  </class>

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 августа 2009

Когда я использую inverse = 'true', значения таблицы соединений (т.е. PersonAddressMap) не вставляются.

Если я установлю inverse = 'false', они вставляются, но я также вижу, что операторы удаления происходят в sql

0 голосов
/ 16 июня 2009

отношения «многие ко многим» ВСЕГДА требуют, чтобы вы пометили одну конечную точку отношения инверсией. В вашем конкретном примере вы можете использовать AddressDetails of Person. например,

<bag name="AddressDetails" table="PersonAddressMap" cascade="all" inverse="true">
  <key column="PersonId" />
  <one-to-many class="PersonAddressMap" />
</bag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...