gpt4 book ai didi

java - JPA 的 EntityManager 应该是 RequestScoped 吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:42:39 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com