Запрос гибернации для возврата результатов отношения БД "многие ко многим" без сопоставления отношения - PullRequest
0 голосов
/ 27 марта 2011

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

У меня есть отношение «многие ко многим», определенное в моей базе данных между role и message. Идея заключается в том, что роли (например, группе пользователей) могут быть назначены сообщения в этом приложении, а сообщению можно назначить множество ролей. Это для предоставления средств передачи сообщений группам пользователей в приложении.

Я не обязательно хочу, чтобы моя объектная модель напрямую отражала это отношение «многие ко многим». Например, я не обязательно хочу, чтобы мой объект Role знал что-либо о сообщениях, и я не хочу, чтобы в Message была коллекция ролей (хотя я мог бы повлиять на это, если кажется, что это будет лучше). Я думал, что в этом случае я бы предпочел иметь услугу, которая заняла бы

  • для загрузки сообщений: набор ролей и выдача соответствующих сообщений
  • для сохранения сообщения: Набор или Роли и Сообщение, к которому оно относится

В настоящее время у меня есть сопоставления Message и Role, но я делаю не имею таблицу связывания message_role сопоставлена.

Итак, у меня есть пара вопросов о том, как запрашивать сообщения для ролей:

  • Должен ли я по-прежнему создавать сопоставление для таблицы ссылок? Я считаю, что видел, что мне не нужно объявлять атрибут name в элементе класса в файле отображения hibernate; объявление сопоставления без необходимости сопоставлять его с POJO (скорее, давая ему имя объекта). Я начал идти по этому пути, но не был уверен, как сопоставить таблицу после этого, потому что таблица действительно просто содержит составной ключ, причем каждый столбец в первичном ключе является внешним ключом в связанных таблицах.
  • Итак, поскольку я не был уверен в этом, на самом деле я сейчас использую именованный запрос, который выглядит следующим образом:

    <![CDATA[
    select m.*
    from message m
    right join message_role mr on m.message_id=mr.message_id
    where
    m.effective_date <= :date
    and m.expiration_date >= :date
    and mr.role_id in (:roleIds)
    ]]>
    

    </ SQL-запрос>

(извините, по какой-то причине не удалось включить в форматирование теги sql-запроса)

Это на самом деле работает, но я получаю List<Object[]>, возвращенный из моего запроса вместо List<Message>. Где Object[] представляет возвращаемые столбцы. Я понимаю, что это потому, что запрос не ссылается на сущность Message и, следовательно, Hibernate не знает, как создавать объекты Message на основе результатов запроса. И из того, что я обнаружил, не представляется возможным присоединить сущность к не-сущностной таблице в HQL.

Итак, я просто ищу какие-то входные данные для (1), есть ли предпочтительная / лучшая практика для отображения двух сущностей (Роль / Сообщение), которые связаны (многие-ко-многим) в базе данных, но я не обязательно, чтобы они отображались как таковые в POJO. Если нет, то я застрял с использованием моего sql-запроса, а затем просто вручную строил POJO-сообщение в случае этого запроса?

1 Ответ

0 голосов
/ 29 марта 2011

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

Если есть другие углы, которые я еще не рассмотрел, я все еще открыт для ввода, но сейчас я могу жить с Message, имеющим сопоставленную коллекцию ролей.

...