有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA的EntityManager应该是RequestScope?

我正在使用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();
 }

这是去的路吗


共 (1) 个答案

  1. # 1 楼答案

    I am using ExtendedPerssisteenceContext as My Entities contain child Entity Collections of Lazy Loading type.

    这不是使用EXTENDED的好理由。我建议你做default,也就是TRANSACTION。在非企业环境中,或者在使用应用程序管理的持久性时,最好将EntityManager请求范围或方法范围限定,因为这不是一个很难创建的对象。此外,使用应用程序范围的EntityManager都不是一个好主意,因为它不是线程安全的

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

    注意:

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

    链接:

    建议:

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

    1. 进行单独的AJAX调用以加载子对象
    2. 在视图中使用名为open session的筛选器。我更喜欢前者

    链接: