Отображение отношений без знания конкретного класса в Hibernate

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

Проблема:

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

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

Где:

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

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

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

Что я пробовал

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

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

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

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

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

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

Вопрос

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

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

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


person iamagalaxy    schedule 07.06.2011    source источник


Ответы (1)


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

person Stevi Deter    schedule 07.06.2011