1

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

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

几个问题:

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

0 回答 0