java – JPA的EntityManager应该是RequestScoped吗?
我正在使用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(); } 这是要走的路吗? 解决方法
这不是使用EXTENDED的好理由.我建议你把它设为默认值,即TRANSACTION.最好在非企业环境中或使用应用程序管理的持久性时使您的EntityManager请求范围或方法范围,因为这不是一个非常重要的创建对象.而且,既不使用应用程序范围的EntityManager也不是一个好主意,因为它不是线程安全的. 话虽如此,当您使用JBoss时,您应该让容器处理EntityManager的生命周期,以防您使用JTA.因此,只需注入一切默认值即可 注意: 只有有状态会话bean才能拥有容器管理的扩展实体管理器. 链接: > http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html 建议: 您的业??务方法应该知道是否加载孩子.但那是理想的情况.很多时候我们不能说并且完全取决于用户输入 – 我们无法预测这一点.因此,有两种解决方案, >进行单独的AJAX调用以加载子项 链接: > https://community.jboss.org/wiki/OpenSessionInView (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |