关于 java:实例化 JPA 管理器 bean 的”正确”方式?

The 'correct' way to instantiate JPA manager bean?

我正在使用 IBM RAD 开发一些 JPA 实体,并从这些实体中开发相应的 JPA Manager Bean。管理器 bean(由 RAD 生成)具有以下成员:

1
2
@PersistenceUnit
private EntityManagerFactory emf;

我不确定如何从无状态 EJB (3.0) 正确实例化(或获取对)此管理器 bean,因此我向管理器 bean 添加了一个构造函数,我可以在其中传递 EntityManagerFactory 实例给它。我通过使用 `@PersistenceUnit\\' 注释在 EJB 中获得对 EntityManagerFactory 的引用,如下所示:

1
2
@PersistenceUnit
private EntityManagerFactory _entityManagerFactory;

这似乎相当不必要,我相信必须有一种方法告诉容器(在我的例子中是 Websphere 7.0)以某种方式为我"引导",以便我立即获得对 JPA 管理器 bean 的引用。是吗?

更新:
看来我还不够详细。对不起。

  • 涉及三个对象:JPA 实体、JPA 实体管理器和无状态 EJB。
  • JPA Entity Manager 类(不是 EJB)由 RAD 创建,并在其上具有方便的方法(命名查询)。它还定义了成员@PersistenceUnit private EntityManagerFactory emf。我知道我可以直接使用 EntityManager ,但我想使用 MyEntityManager 来获得它的便利方法。
  • 我可以通过使用上述注释在无状态 EJB 中获得对 EntityManager 或 EntityManagerFactory 的引用(也像 Bozho 建议的那样)
  • 我想在无状态 EJB 中获得对 JPA Entity Manager 的引用。如果我"新建"它(new MyEntityManager()),则 emf 字段为空。解决方法是在 EJB 中声明 @PersistenceUnit 字段,然后将其传递给 JPA 实体管理器并使用它。
  • 想一想,也许我可以将 JPA 实体管理器声明为 EJB 并完成它......(尽管这似乎又是不必要的)。我认为有一种方法 PersistenceContext.getJpaManager(MyEntityManager.class) 我可能会丢失。

1
2
@PersistenceContext
private EntityManager em;

看来你有你的自定义 bean 想要注入到其他 bean 中(它至少需要一个本地接口):

1
2
@EJB
private MyEntityManager em;