java - JPA 的 EntityManager 应该是 RequestScoped 吗?

标签 java hibernate jpa-2.0 java-ee-6

我正在使用 JBoss7 开发基于 JavaEE6 的 Web 应用程序。 在我的应用程序中,我将 EntityManager 注入(inject)到我的 EJB 中:

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

}

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

}

问题是当我使用 ForumServiceEJB 的 EntityManager 更新一些数据然后将更改放入 DB 但 TopicServiceEJB 的 EntityManager 无法看到这些更改并且结果总是从缓存中获取时。

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

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

我在某处读到 EntityManagers 应该是 RequestScoped 对象。

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

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

这是要走的路吗?

最佳答案

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

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

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

注意:

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

链接:

建议:

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

  1. 进行单独的 AJAX 调用以加载子项
  2. 使用名为 open-session-in-view 的过滤器。我更喜欢前者。

链接:

关于java - JPA 的 EntityManager 应该是 RequestScoped 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10747904/

相关文章:

hibernate - 错误 : operator does not exist: character varying = bytea

java - hibernate 延迟加载不起作用

java - 如何从图库中选择多张图片?

java - 如何成对存储 int 和 boolean

java - 映射到 com.vividsolutions.jts.geom.Point 无效的字节序标志

java - "could not initialize a collection"+ @Lob + MSSQL

hibernate - 如何使用 JPA CriteriaBuilder 查询执行外连接?

java - 在 Java 中读取 Xml Formatter 格式的日志文件的最佳策略?

java - 无法使用 Selenium + Java 定位类跨度元素

java - 无法创建表: Hibernate