"Правильный" способ создания экземпляра bean менеджера JPA?

Я использую IBM RAD для разработки некоторых сущностей JPA, и из них соответствующих бинов JPA Manager. Бины менеджера (которые генерируются RAD) имеют следующий член:

@PersistenceUnit
private EntityManagerFactory emf;

Я не уверен, как исправить экземпляр этого компонента управления (или получить ссылку на него) из EJB без состояния (3.0), поэтому я добавил конструктор в компонент управления, куда я могу передать EntityManagerFactory пример этому. Я получаю ссылку на EntityManagerFactory в EJB с помощью аннотации `@PersistenceUnit', например, так:

@PersistenceUnit
private EntityManagerFactory _entityManagerFactory;

Это кажется довольно ненужным, и я считаю, что должен быть способ сказать контейнеру (Websphere 7.0 в моем случае) как-то "загрузить" это для меня, чтобы я сразу получил ссылку на компонент управления JPA. Это?

Обновление: Кажется, я недостаточно тщательно проработал компонент. Простите за это.

  • Здесь задействованы три объекта: JPA Entity, JPA Entity Manager и EJB без сохранения состояния.
  • Класс JPA Entity Manager (не EJB) создается RAD и имеет методы удобства (именованные запросы). Он также определил члена @PersistenceUnit private EntityManagerFactory emf, Я знаю, что могу использовать EntityManager напрямую, но я бы хотел использовать MyEntityManager для удобства.
  • Я могу получить ссылку на EntityManager или EntityManagerFactory в EJB без состояния, используя аннотации, описанные выше (а также, как предлагает Божо)
  • Я хотел бы получить ссылку на JPA Entity Manager в EJB без сохранения состояния. Если я "новый" его вверх (новый MyEntityManager()), поле ЭДС нуль. Обходной путь должен объявить поле @PersistenceUnit в EJB, а затем передать его в JPA Entity Manager и использовать его.
  • Если подумать, может быть, я мог бы объявить JPA Entity Manager как EJB и покончить с этим... (хотя это опять-таки кажется ненужным). Я подумал, что есть метод по принципу PersistenceContext.getJpaManager(MyEntityManager.class), который, возможно, мне не хватает.

1 ответ

Решение
@PersistenceContext
private EntityManager em;

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

@EJB
private MyEntityManager em;
Другие вопросы по тегам