Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

    @Entity
    public class BaseEntity {
        public long id;
        @Id @GeneratedValue
        public long getId() {...
        ... other variables, getters, setters ...
    }
    
    @Local
    public interface EntitiyManagerWithExtendedEntitiesInterface {
        public EntityManager getEntityManager;
    }
    
  • Первый модуль 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;
        }
    }
    
  • Во втором модуле 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 на другой набор расширений.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top