Отображение отношений без знания конкретного класса в Hibernate - PullRequest
1 голос
/ 08 июня 2011

В Hibernate есть много тем об абстрактном отображении, но я не могу найти что-то, что соответствует моему случаю.

Проблема:

Моя модель домена состоит изнесколько сущностей, которые не наследуются друг от друга.Например:

  • Сотрудник
  • Группа
  • Отдел
  • Отчет

Где:

Сотрудник <-> Группа (n: m), Сотрудник -> Отдел (n: 1)

Что касается этого, нет проблем.Но:

Я хочу иметь возможность сопоставлять отчет одному из сотрудников, групп или отделов (1: 1).(Пример упрощен, так как Отчет должен отображаться на множество других различных объектов).Каждый объект должен находиться в своей собственной таблице, так как разные внешние устройства хотят подключиться к базе данных, и модель не должна изменяться в отношении общей структуры таблицы других объектов.

То, что я пытался

  1. Я пытался использовать стратегию Hibernate Inheritance с таблицей на класс, тогда как пользователь, сотрудник и отдел подклассы из нового AbstractEntity , общий доступ к идентификатору и свойству Name из родительского класса.Таким образом, у пользователя, сотрудника и отдела все еще есть свои собственные таблицы.Теперь я могу отобразить Report <-> AbstractEntity , и это работает. НО: Как и следовало ожидать, это вызывает серьезные проблемы с производительностью, когда существует более 20 отчетов или около того, поскольку Hibernate внутренне вынужден выполнять тяжелые объединения для всех таблиц подклассов.

  2. Одиночная таблица в иерархии не является опцией из-за изменения структуры таблицы (см. Проблема).Кроме того, все объекты имеют только общие идентификатор и имя в качестве общих свойств.

Возможное решение

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

Но: проблема здесь в том, что я не могу выполнять сессионные вещи в классе сущностей, так как сессия неизвестен классу отчета.Кроме того, это смешало бы логику и уровень модели.

Обходной путь должен был бы написать какую-то оболочку в DAO, где правильный объект загружается из базы данных и внедряется в результат.Но это очень подвержено ошибкам, так как каждый метод DAO должен быть переопределен.

Вопрос

Итак, мой вопрос: есть ли способ как-то перехватить или перехватитьпоиск объекта отчета из базы данных и загрузка в него правильного объекта AbstractEntity?

Или есть другой, более элегантный способ сделать то, что я хочу (должен быть;))?

Iиспользую Hibernate 3.6 с использованием аннотаций без EntityManager в среде Java EE с DAO, как в http://community.jboss.org/wiki/GenericDataAccessObjects.

1 Ответ

1 голос
/ 08 июня 2011

Я бы воспользовался противоположным подходом: я бы отобразил Отчет как таблицу для иерархии классов и добавил столбец дискриминатора, чтобы определить, является ли это отчетом о сотруднике, группе или отделе.

...