Общая библиотека для EntityManager CDI - PullRequest
1 голос
/ 25 марта 2019

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

public abstract class GenericDao implements IGenericDao {

@PersistenceContext(unitName = "XXXX")
private EntityManager entityManager;

и в другом модуле

public class CarDao extends GenericDao{

У меня есть много проектов, использующих этот общий DAO, но у каждого проекта есть своя единица персистентности.

Единица персистенции - это отличия по проекту, где используется общая библиотека

Суть в том, что я не мог использовать POO с абстрактным getEntityManager, внедренным в каждую микросервисную программу, потому что в общем проекте у нас есть история DAO, общая для всех микросервисов, и для каждой из них мне нужно извлечь entityManager, внедренный из микросервиса

Я делаю неправильно или хорошо? а как установить еперьенство в каждом проекте? (у каждого проекта есть много для DAO, и я не хочу каждый раз повторять методы CRUD)

Ответы [ 2 ]

1 голос
/ 25 марта 2019
@PersistenceContext(unitName = "XXXX")
private EntityManager entityManager;

Это должно быть сделано в каждом конкретном классе, абстрактный должен реализовывать конкретную операцию, используя

getEntityManager().doSomething(entity)

получатель getEntityManager(), являющийся абстрактным.

Имхо этозапах дизайна, EntityManager - это уже абстракция, и вам нечего его заключить.

[ edit ]

Относительно "фабричного" подхода, способав CDI для динамического внедрения ресурсов используется producer methods.

. Вы можете создать метод, возвращающий экземпляр EntityManager, который будет динамически разрешать EntityManagerFactory в соответствии с именем единицы сохраняемости (см. пример * 1020).* here ).

Обратите внимание, что это очень плохая идея, поскольку область действия entityManager обычно привязана к транзакции, что позволяет контейнеру внедрить экземпляр entityManager, гарантирующий, что область действия будетбыть правильно обработанным (контейнером).Единственная жизнеспособная конфигурация с этим подходом - это когда вам нужно «управляемое приложение» entityManager

Примечание: обратите внимание, что данный пример будет создавать новый экземпляр EntityManageFactory для каждой инъекции, который может быть действительно катастрофическим в соответствии скак вы его используете (EntityManageFactory должен быть создан один раз для всех приложений)

обязательно ознакомьтесь с жизненным циклом EntityManager , прежде чем идти дальше.

0 голосов
/ 02 апреля 2019

Спасибо, парень, за твои советы, на самом деле я был совершенно глупым в моем genericDao, проще говоря,

public abstract class GenericDao implements IGenericDao {


@PersistenceContext
private EntityManager entityManager; 

Поскольку у нас есть только один PersistentUnit, он будет автоматически добавлен ....

было так легко!

тогда я могу использовать @PersistentContext во всех DAO или просто и лучше всего вызвать getEntityManager из их родительского IGenericDao

...