Отображение NHibernate: простое соединение по внешнему ключу - PullRequest
1 голос
/ 10 июля 2009

Столы

Currencies
----------
CurrencyId INT IDENTITY PK
IsoCode4217 CHAR(3) -- "USD", "GBP", "EUR", etc

Users
----------
UserId INT IDENTITY PK
CurrencyId FK REFERENCES Currencies (CurrencyId)

Отображение

Текущее приложение имеет объект Currency, которому необходимо значение IsoCode4217. Currency не является сущностью в этом приложении, это его собственная странная жестко запрограммированная вещь, где мне нужно передать значение IsoCode4217 статической функции и получить экземпляр Currency обратно. Таблица базы данных Currencies является скорее таблицей перечисления. Итак, я решил, что я просто реализую IUserType, и я пойду, но это не сработает, как я ожидал:

[hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"]
  [class
    name="BlahBlah.UserProfile, BlahBlah.Model"
    schema="Core"
    table="Users"
    lazy="false"]
    [id name="Identity" access="field.camelcase" column="UserId"]
      [generator class="native" /]
    [/id]
    [join
      schema="Core"
      table="Currencies" 
      fetch="join"]
      [key column="CurrencyId" property-ref="Currency" /]
      [property
        name="Currency"
        column="IsoCode4217" 
        type="BlahBlah.CurrencyUserType, BlahBlah.Model" /]
    [/join]
  [/class]
[/hibernate-mapping]

(Я изменил угловые скобки на обычные скобки, поскольку мне не хочется думать о том, что собирается делать этот маленький редактор Markdown.)

Гадкий

SQL, который я бы ожидал, это

SELECT
  u.UserId,
  c.IsoCode4217
FROM Users AS u
INNER JOIN Currencies AS c
   ON u.CurrencyId = c.CurrencyId

, но вместо того, чтобы NHibernate упорно дает мне

SELECT
  u.UserId,
  c.IsoCode4217
FROM Users AS u
INNER JOIN Currencies AS c
  ON u.UserId = c.CurrencyId -- DANG IT!

Это действительно не поддерживается, или я пропускаю что-то очевидное? Можно ли просто "зациклить" дополнительный столбец из другой таблицы с целью отображения одного объекта?

Спасибо!

1 Ответ

0 голосов
/ 10 июля 2009

Присоединяемые отображения - это PITA! Проблема в том, что Hibernate ожидает сопоставления соединения для сопоставления родительской таблицы с дочерней таблицей, тогда как вы соединяете дочернюю таблицу с родительской таблицей.

По сути, сопоставления соединений были разработаны, чтобы упростить объединение в таблицах, которые имеют отношение один к одному и где родительская таблица соединяется с дочерней таблицей.

Я думаю, что в вашей ситуации вы хотите иметь сопоставление многие-к-одному, а не соединение

...