在Singleton EJB中指定EntityManager;从Stateless EJB访问。好?坏?

时间:2013-11-06 14:21:56

标签: jpa transactions jndi entitymanager

我想从大部分实现中抽象出指定EntityManager的细节,所以我将@PersistenceContext(...) EntityManager em;声明放在@Singleton bean中。该bean有一个getEm()方法,应用程序的其余部分用于获取EntityManager(实际上有几个EntityManagers,都以相同的方式完成)。执行JPA相关操作的每个@Stateless bean都会注入@Singleton bean,然后调用getEm()方法来获取EntityManager。

这种方法有三个主要原因:(1)在unitName声明中保持@PersistenceContext的规范在一个地方(即避免重复注入@PersistenceContext重复{ {1}}); (2)保持选项打开以更改EntityManager的获取,以便稍后注入JNDI查找; (3)在实时/备用场景中使用多个实体管理器时,允许一些逻辑动态地确定合适的实体管理器。

几个问题:

  1. 这种做法本质上存在缺陷吗?如果是这样,是否有更好的方法来实现列出的3个目标?
  2. 以这种方式获取EntityManager时(注入unitName时),每个@Singleton bean都会为每个事务(容器管理的事务)获得一个“新的”EntityManager。或者我是否需要做一些特定的事情来防止@Stateless bean被重新使用的EntityManager变得陈旧?
  3. @Stateless中的JNDI查找#2相同。
  4. 如果每个事务都没有获得“新鲜”的EntityManager(可能是由于某些JPA / JTA交互),那么我怀疑这种方法不是线程安全的,因为从{1}}获取了单个EntityManager @Singleton。有哪些方法可以解决这个问题?

0 个答案:

没有答案