我正在使用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无法看到这些更改,结果始终从Cache中提取。
我正在使用ExtendedPerssisteenceContext,因为我的实体包含延迟加载类型的子实体集合。
如何使用ExtendedPersistenceContext类型的/ Inject EntityManager并在一个EJB中创建不同的EntityManager仍然可以看到其他不同的EJB EntityManagers所做的更改?
我读到的某个地方EntityManagers应该是RequestScoped对象。
public class MyEntityManagerProducers {
@Produces @RequestScoped
public EntityManager createDbEm() {
return Persistence.createEntityManagerFactory("forumDb").
createEntityManager();
}
public void disposeUdEm(@Disposes EntityManager em) {
em.close();
}
这是要走的路吗?
答案 0 :(得分:1)
我正在使用ExtendedPerssisteenceContext,因为我的实体包含子项 延迟加载类型的实体集合。
这不是使用EXTENDED
的好理由。我建议你default
,TRANSACTION
。在非企业环境中或使用应用程序管理的持久性时,最好使用EntityManager
请求范围或方法范围,因为这不是一个非常重要的对象。而且,既不使用应用程序范围的EntityManager也不是一个好主意,因为它不是线程安全的。
话虽如此,当你使用JBoss时,你应该让容器处理EntityManager
的生命周期,以防你使用JTA。因此,只需注入所有default
注意:强>
只有有状态会话bean才能拥有容器管理的扩展实体管理器。
<强>链接:强>
<强>建议:强>
您的商业方法应该知道是否要加载孩子。但那是理想的情况。很多时候我们不能说并且完全取决于用户输入 - 我们无法预测这一点。因此,有两种解决方案,
<强>链接:强>