Hibernate реверс-инжиниринг - PullRequest
3 голосов
/ 10 марта 2010

У меня есть структура, в которой основная таблица - USER, другие таблицы включают CATEGORY (содержит user_id)

То, что я получил после стандартной процедуры обратного инжиниринга, было:

  • Пользователь класса содержит коллекцию категорий,
  • класс Category не содержал внешний ключ (user_id), но содержал объект User.

Почему он не содержал внешний ключ в качестве свойства класса?

А как мне объединить эти две таблицы в HQL без этого клея? HQL - объясните, пожалуйста, эту часть.

Ответы [ 3 ]

3 голосов
/ 10 марта 2010

Почему он не содержал внешний ключ как свойство класса?

Поскольку Hibernate является инструментом реляционного отображения Object , Hibernate позволяет работать с объектной моделью (то есть объектами и отношениями между объектами) и отображать их в представлении базы данных (строки данных таблиц). Весь смысл Hibernate в том, чтобы устранить разрыв между объектно-ориентированной парадигмой и реляционной парадигмой (знаменитое Несоответствие объектно-реляционного импеданса ). И в вашем случае эта следующая объектная модель является ожидаемым (и правильным) представлением объекта:

альтернативный текст http://img251.imageshack.us/img251/6335/110b578b.png

А как мне объединить эти две таблицы в HQL без этого клея?

Клей есть , но вы должны думать об объекте (и ассоциации). Например (см. 14.3. Ассоциации и объединения ):

from Category as category join category.user as user

Обратите внимание, что HQL поддерживает две формы объединения ассоциаций: неявное и явное (см. 14.4. Формы синтаксиса объединения ). В приведенном выше примере используется явное соединение. неявная форма использует не ключевое слово join, а точечную запись:

from Category category where category.user.id =: id
3 голосов
/ 10 марта 2010

Hibernate автоматически обрабатывает внешний ключ для вас в этом случае. Что касается Java, вам не нужно думать о внешних ключах, а нужно агрегировать. Вот почему Category содержит (ссылка на) User объект, а не FK. Связывание между свойством user класса Category и столбцом FK в таблице USER указывается в отображении Hibernate.

Если вы затем создадите Критерии или Запрос с использованием этих классов, Hibernate автоматически сгенерирует запрос SQL, используя соответствующий FK. У меня нет опыта работы с HQL, но я уверен, что Hibernate справится и с этим правильно.

Обновление: Пример HQL:

from Category as category inner join fetch category.user as user

Пример адаптирован из здесь .

Дополнительные сведения о сопоставлении см. В справочнике Hibernate, главы с 5 по 7.

.
0 голосов
/ 10 марта 2010

Я согласен с Петером Тёроком: текущее поведение в спящем режиме является ожидаемым.

Например, что делать в режиме гибернации при обновлении категории, в которой вы изменили пользователя, а не необработанный FK?

Зачем вам нужен сырой ФК? вам просто нужно сделать category.getUser (). getId (); иметь доступ к нему, не рискуя противоречивым состоянием в вашем объекте Category.

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