Hibernate: многие-к-одному, используя формулу - PullRequest
3 голосов
/ 25 февраля 2010

Надеюсь, кто-нибудь поможет мне найти ответ.

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

У меня есть три основных таблицы: A, B, C .

A имеет столбец со ссылкой на B (отношение многие к одному). Проблема в том, что он должен иметь отношение к C, а не к B. Поэтому я создал отображение * -1 BC.

Tables: A,B,C,BC (all have ID field)
A-B many to one
B-C many to one through BC
Needed:A-C without altering A,B or C

Я не хочу иметь Java-сущности для B или BC, только A и C, и у A должно быть поле A.c

До сих пор я пытался использовать аннотацию @Formula безрезультатно.

class A{
  @ManyToOne
  @Formula(value="select BC.c from BC where BC.b = b")
  private C c;
}

это приводит к следующему SQL:

select this_.c_ID from A this_

Очевидно, что он не работает, поскольку в таблице A нет столбца c_ID (почему формула полностью игнорируется?).

Удаление аннотации @ManyToOne приводит к:

select (select BC.c from BC where BC.b = this_.b) as formula_0 from A this_

Это было бы идеально, за исключением того, что Hibernate ожидает значение BINARY (сериализация класса C?) И выдает исключение при приведении целого числа, которое он получает.

Этого идентификатора должно быть достаточно для отложенной загрузки, но как мне сказать, чтобы он это делал? любое использование @ManyToOne нарушает формулу.

Как получить ссылку A-C без изменения таблиц A, B, C или создания классов Java B или BC?

Спасибо за любую информацию, Dan

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

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

0 голосов
/ 23 июня 2010

Это должно работать в Hibernate 3.5.0-Beta-2 + ( HHH-4382 исправлено).

...