Я новичок в 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-сообщение в случае этого запроса?