Расширение сопоставления сущностей JPA - PullRequest
0 голосов
/ 03 мая 2009

Я ищу простой способ расширить существующее отображение JPA. Идея заключается в следующем:

У меня есть проект EAR с модулем EJB3 + JPA, в котором ClassA аннотирован и сопоставлен с таблицей class_a. Но я хочу, чтобы какой-то другой модуль (другой модуль EJB) имел ClassB, который добавляет больше свойств в ClassA (расширение?).

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

Я сделал простую проверку, но мне кажется, что я не могу расширить ClassA во втором модуле (по ClassB), потому что они используют разные EntityManagerFactories и некоторые классы из первого модуля не видны вторым и наоборот.

Я уже видел тег внутри файла persistence.xml. Мне нужно что-то подобное, но для его использования необходимо, чтобы этот файл был указан в первом модуле, и он должен существовать (он не будет пропущен, если не найден). Есть ли что-то подобное, что можно поставить на расширяющий модуль (второй), а не на расширяемый (первый)?

Если есть способ расширить отображение JPA во время выполнения, было бы здорово. Есть ли такой способ? Есть ли другое решение моей проблемы?

1 Ответ

0 голосов
/ 19 июня 2009

Внедренное решение заключается в следующем. У меня есть одна банка и два модуля EJB:

  1. Баночка является основной. Он содержит базовые объекты и локальный интерфейс для расширения:

    @Entity
    public class BaseEntity {
        public long id;
        @Id @GeneratedValue
        public long getId() {...
        ... other variables, getters, setters ...
    }
    
    @Local
    public interface EntitiyManagerWithExtendedEntitiesInterface {
        public EntityManager getEntityManager;
    }
    
  2. Первый модуль EJB - это модуль, который расширит базовые сущности и добавит EJB для получения менеджера сущностей. Этот модуль также включает persistence.xml со строкой <jar-file>../path_to_first_jar_file.jar</jar-file>.

    @Entity
    ... discriminator annotations
    public class ExtEntity extends BaseEntity {
        ... additional fields here
    }
    
    @Stateless
    public class EntitiyManagerWithExtendedEntitiesBean implements EntitiyManagerWithExtendedEntitiesInterface {
        @PersitenceContext
        EntityManager em;
        public EntityManager getEntityManager() {
            return em;
        }
    }
    
  3. Второй модуль EJB будет иметь EJB-компоненты, для компиляции которых требуется только jar-файл, но для запуска необходим первый EJB-компонент (требуется EJB-компонент, реализующий интерфейс EntitiyManagerWithExtendedEntitiesInterface).

    @Stateless
    public class getSomeEntity {
        @EJB
        EntitiyManagerWithExtendedEntitiesInterface ext;
        EntityManager em;
        @PostConstruct
        public void injectEntityManager() {
            em = ext.getEntityManager();
        }
        public void ejbInterfaceMethod() {
            ... method that uses em variable (EntityManager)
        }
    }
    

Таким образом, серверу приложений придется управлять зависимостями между модулями, и я могу легко поменять 1-й модуль EJB на другой набор расширений.

...