В Hibernate есть много тем об абстрактном отображении, но я не могу найти что-то, что соответствует моему случаю.
Проблема:
Моя модель домена состоит изнесколько сущностей, которые не наследуются друг от друга.Например:
- Сотрудник
- Группа
- Отдел
- Отчет
Где:
Сотрудник <-> Группа (n: m), Сотрудник -> Отдел (n: 1)
Что касается этого, нет проблем.Но:
Я хочу иметь возможность сопоставлять отчет одному из сотрудников, групп или отделов (1: 1).(Пример упрощен, так как Отчет должен отображаться на множество других различных объектов).Каждый объект должен находиться в своей собственной таблице, так как разные внешние устройства хотят подключиться к базе данных, и модель не должна изменяться в отношении общей структуры таблицы других объектов.
То, что я пытался
Я пытался использовать стратегию Hibernate Inheritance с таблицей на класс, тогда как пользователь, сотрудник и отдел подклассы из нового AbstractEntity , общий доступ к идентификатору и свойству Name из родительского класса.Таким образом, у пользователя, сотрудника и отдела все еще есть свои собственные таблицы.Теперь я могу отобразить Report <-> AbstractEntity , и это работает. НО: Как и следовало ожидать, это вызывает серьезные проблемы с производительностью, когда существует более 20 отчетов или около того, поскольку Hibernate внутренне вынужден выполнять тяжелые объединения для всех таблиц подклассов.
Одиночная таблица в иерархии не является опцией из-за изменения структуры таблицы (см. Проблема).Кроме того, все объекты имеют только общие идентификатор и имя в качестве общих свойств.
Возможное решение
Одним из возможных решений было бы внедрение сопоставления самостоятельно,То есть я храню идентификатор и класс сущности в отчете.Получатель для AbstractEntity теперь может решить, основываясь на сохраненных значениях, из какой таблицы загрузить и вернуть правильную сущность.
Но: проблема здесь в том, что я не могу выполнять сессионные вещи в классе сущностей, так как сессия неизвестен классу отчета.Кроме того, это смешало бы логику и уровень модели.
Обходной путь должен был бы написать какую-то оболочку в DAO, где правильный объект загружается из базы данных и внедряется в результат.Но это очень подвержено ошибкам, так как каждый метод DAO должен быть переопределен.
Вопрос
Итак, мой вопрос: есть ли способ как-то перехватить или перехватитьпоиск объекта отчета из базы данных и загрузка в него правильного объекта AbstractEntity?
Или есть другой, более элегантный способ сделать то, что я хочу (должен быть;))?
Iиспользую Hibernate 3.6 с использованием аннотаций без EntityManager в среде Java EE с DAO, как в http://community.jboss.org/wiki/GenericDataAccessObjects.