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 楼答案
这不是使用
EXTENDED
的好理由。我建议你做default
,也就是TRANSACTION
。在非企业环境中,或者在使用应用程序管理的持久性时,最好将EntityManager
请求范围或方法范围限定,因为这不是一个很难创建的对象。此外,使用应用程序范围的EntityManager都不是一个好主意,因为它不是线程安全的话虽如此,当您使用JBoss时,您应该让容器处理
EntityManager
的生命周期,以防您使用JTA。因此,只需将其注入所有default
注意:
只有有状态会话bean可以有容器管理的扩展实体管理器
链接:
建议:
你的商业方法应该知道是否给孩子们加载。但这是理想的情况。很多时候我们不能这么说,完全取决于用户的输入,我们无法很好地预测。因此,有两种解决方案
链接: