假设有一个简单的JSF网页应用程序(没有Seam),其中JSF bean调用了几个EJB,这些EJB又加载并保存JPA实体。我想使用@Singleton
注释来替代EntityManagerFactory
,并注入EntityManager
:
@Singleton
public class MyEJB {
@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
protected EntityManager em; // not EntityManagerFactory
}
规范说明
@Singleton
是线程安全的,支持并发和事务属性,这使其可以安全地从JSF bean中调用。我还期望由于EntityManager
不会为每个调用重新创建,并且具有内部缓存能力,因此也会带来性能上的好处。在这里,我的主要关注点是在拥有多个单例对象的情况下对JPA实体进行创建/更新操作,从而导致存在相同数量的长期存在的EntityManagers。
- 如果一个单例对象更新了JPA实例,那么这些更改如何传播到其他单例对象?
- 由于我无法关闭entity manager,在每次实体更新时是否需要刷新它?
- 如果这几个单例对象共享同一个entity manager,会更好吗?
- 我只看到了很少的这种设计示例。为什么? 是否有任何严重的缺点?