Java JPA&x27;s EntityManager是否应为RequestScope?

Java JPA&x27;s EntityManager是否应为RequestScope?,java,hibernate,jpa-2.0,java-ee-6,Java,Hibernate,Jpa 2.0,Java Ee 6,我正在使用JBoss7开发一个基于JavaEE6的web应用程序。 在我的应用程序中,我在EJB中注入EntityManager,如下所示: class ForumServiceEJB { @PersistenceContext(type=EXTENDED) private EntityManager em; } class TopicServiceEJB { @PersistenceContext(type=EXTENDED) private EntityM

我正在使用JBoss7开发一个基于JavaEE6的web应用程序。 在我的应用程序中,我在EJB中注入EntityManager,如下所示:

class ForumServiceEJB
{
    @PersistenceContext(type=EXTENDED)
    private EntityManager em;

}

class TopicServiceEJB
{
    @PersistenceContext(type=EXTENDED)
    private EntityManager em;

}
问题是,当我使用ForumServiceEJB的EntityManager更新一些数据时,这些更改会被转换到DB中,但TopicServiceEJB的EntityManager无法看到这些更改,结果总是从缓存中获取

我使用ExtendedPersisteenContext,因为我的实体包含延迟加载类型的子实体集合

如何使用/注入ExtendedPersistenceContext类型的EntityManager,并使一个EJB中的不同EntityManager仍然可以看到其他不同EJB EntityManager所做的更改

在我读到的某个地方,EntityManager应该是RequestScope对象

public class MyEntityManagerProducers {
 @Produces @RequestScoped 
 public EntityManager createDbEm() {
   return Persistence.createEntityManagerFactory("forumDb").
          createEntityManager();
 }

 public void disposeUdEm(@Disposes EntityManager em) {
   em.close();
 }
这是去的路吗

我使用ExtendedPersisteenContext作为我的实体包含子实体 延迟加载类型的实体集合

这不是使用
EXTENDED
的好理由。我建议您将其设置为
默认值
,即
事务
。在非企业环境中或使用应用程序管理的持久性时,最好将您的
EntityManager
请求范围或方法范围限定,因为这不是一个很难创建的对象。此外,使用应用程序范围的EntityManager都不是一个好主意,因为它不是线程安全的

话虽如此,在您使用JBoss时,您应该让容器处理
EntityManager
的生命周期,以防您使用JTA。因此,只需将其与所有
default

注意:

只有有状态会话bean可以具有容器管理的扩展实体管理器

链接:

建议:

您的业务方法应该知道是否加载子级。但这是理想的情况。很多时候我们不能这么说,完全取决于用户的输入——我们无法很好地预测。因此,有两种解决方案

  • 进行单独的AJAX调用以加载子对象
  • 在视图中使用名为“打开会话”的筛选器。我更喜欢前者
  • 链接:


    那么如何处理在视图中显示子集合?我是否应该在EntityManager关闭之前编写JPQL来加载惰性集合?@sivaprasadeddy.k:您的业务方法应该知道是否加载子级。但这是理想的情况。很多时候我们不能这么说,完全取决于用户的输入——我们无法很好地预测。因此,有两种解决方案,1。进行单独的AJAX调用以加载子对象2。在视图中使用名为“打开会话”的筛选器。我更喜欢前者。非常感谢阿德尔·安萨里。