我已经为此工作了几个小时,但我仍然没有弄清楚将 JPA 与 JSF 结合使用的正确方法是什么。
我有一个 session 范围的托管 bean,它可以做很多事情,其中之一是持久化一些实体对象。 一开始,我创建了一个生产者方法,请求范围,用于构建我的 EntityManager 对象。无论如何,在这里阅读将请求的作用域 bean 注入(inject) session 作用域的 bean 是将该实例包装到 Instance 对象中。完毕。但是当我尝试使用那个 EM 时,我得到了一个需要交易的异常。继续阅读 Internet 上有人告诉我必须使用 PersistenceContext 注释将 EM 直接注入(inject)到我的托管 bean 中。无论如何,我认为使用 persistenceUnit 注释并在我需要它们的方法中创建我的 em 更有意义。注入(inject)有效,但当我尝试保留某些内容时,我仍然遇到需要事务的异常!
所以我想问:这样做的正确方法是什么?
编辑:我使用默认设置使用 Jboss eap 6.2。我正在使用 WEB-INF 中的 xml 文件部署我的数据源,所以我使用的是 JTA。
最佳答案
我是个傻子。过去我已经遇到过这个问题,但我忘记了。
对于所有遇到同样问题的人来说,这里就是解决方案。 容器管理的事务仅在容器是 EJB 时才有效。如果容器是 JSF,它就不起作用!注入(inject)实体管理器的方式并不重要,注入(inject)成功但创建的对象将不起作用。
解决它的方法是创建一个 EJB DAO 对象来为您处理数据库。有点像
@Named
@Stateless
public class MyDAO {
@PersistenceContext(unitName = "SRA")
private EntityManager em;
public void save(Object o) {
em.persist(o);
em.flush();
}
然后像这样将这些对象注入(inject)到您的托管 bean 中:
@ManagedBean
@SessionScoped
public class MyManagedBean {
@EJB
private MyDAO dao;
public void action() {
....
dao.save(o);
}
直接将 EntityManager 注入(inject)到托管 Bean 中会给您一个需要事务的异常。
我仍然不确定是否将类似的东西注入(inject)到范围更广的 bean 中。我稍后会研究这个。
关于java - JPA 和 JSF : right way of injecting EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21479580/