Расширение сопоставления сущностей JPA
Вопрос
Я ищу простой способ расширить существующее отображение 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 на другой набор расширений.