我想从大多数实现中抽象出指定 EntityManager 的细节,所以我将@PersistenceContext(...) EntityManager em;
声明放在一个@Singleton
bean 中。该 bean 有一个getEm()
方法,应用程序的其余部分使用该方法来获取 EntityManager(实际上有几个 EntityManager,都以相同的方式完成)。每个@Stateless
做 JPA 相关操作的 bean 都会注入@Singleton
bean,然后调用getEm()
方法获取 EntityManager。
这种方法有三个主要原因:(1)将声明中的规范保留unitName
在@PersistenceContext
一个地方(即,避免重复注入@PersistenceContext
重复的unitName
);(2) 保持选项打开以更改 EntityManager 的获取,以免稍后注入 JNDI 查找;(3) 当在一个主备场景中使用多个实体管理器时,允许一些逻辑来动态确定合适的一个。
几个问题:
- 这种方法是否存在固有缺陷?如果是这样,是否有更好的方法来实现列出的 3 个目标?
- 当以这种方式获取 EntityManager 时(注入到 EntityManager 中时
@Singleton
),每个@Stateless
bean 都会为每个事务(容器管理的事务)获得一个“新鲜”的 EntityManager。或者我是否需要做一些特定的事情来防止@Stateless
bean 正在 [re] 使用的 EntityManager 变得陈旧? - 与 #2 中的 JNDI 查找相同
@Singleton
。 - 如果每个事务都没有获得“新鲜”的 EntityManager(可能是由于一些 JPA/JTA 交互),那么我怀疑这种方法不是线程安全的,因为
@Stateless
从@Singleton
. 有什么方法可以解决这个问题?