JPA的EntityManager应该是RequestScoped吗?

时间:2012-05-25 02:53:55

标签: 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 EntityManager em;

}

使用ForumServiceEJB的EntityManager更新某些数据时出现问题,然后将更改发送到DB,但TopicServiceEJB的EntityManager无法看到这些更改,结果始终从Cache中提取。

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

如何使用ExtendedPersistenceContext类型的/ Inject EntityManager并在一个EJB中创建不同的EntityManager仍然可以看到其他不同的EJB EntityManagers所做的更改?

我读到的某个地方EntityManagers应该是RequestScoped对象。

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

 public void disposeUdEm(@Disposes EntityManager em) {
   em.close();
 }

这是要走的路吗?

1 个答案:

答案 0 :(得分:1)

  

我正在使用ExtendedPerssisteenceContext,因为我的实体包含子项   延迟加载类型的实体集合。

这不是使用EXTENDED的好理由。我建议你defaultTRANSACTION。在非企业环境中或使用应用程序管理的持久性时,最好使用EntityManager请求范围或方法范围,因为这不是一个非常重要的对象。而且,既不使用应用程序范围的EntityManager也不是一个好主意,因为它不是线程安全的。

话虽如此,当你使用JBoss时,你应该让容器处理EntityManager的生命周期,以防你使用JTA。因此,只需注入所有default

注意:

只有有状态会话bean才能拥有容器管理的扩展实体管理器。

<强>链接:

<强>建议:

您的商业方法应该知道是否要加载孩子。但那是理想的情况。很多时候我们不能说并且完全取决于用户输入 - 我们无法预测这一点。因此,有两种解决方案,

  1. 进行单独的AJAX调用以加载孩子
  2. 使用名为open-session-in-view的过滤器。我更喜欢前者。
  3. <强>链接: