Java JPA&x27;s EntityManager是否应为RequestScope?
我正在使用JBoss7开发一个基于JavaEE6的web应用程序。 在我的应用程序中,我在EJB中注入EntityManager,如下所示: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
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可以具有容器管理的扩展实体管理器
链接: