一尘不染

JPA和JSF:注入EntityManager的正确方法

hibernate

我已经花了几个小时来解决这个问题,但仍然没有弄清楚将JPA与JSF一起使用的正确方法。

我有一个会话范围的托管bean,它可以完成很多事情,其中​​之一是保留一些实体对象。在开始时,我创建了一个生产者方法,该方法以请求为范围,用于构建EntityManager对象。无论如何,将请求的范围内的bean注入到会话范围内的bean的读操作已经完成了将该实例包装到Instance对象中。做完了
但是,当我尝试使用该EM时,出现了需要交易的异常。继续在互联网上阅读,有人告诉我必须使用PersistenceContext批注将EM直接注入到我的托管bean中。无论如何,我认为使用persistenceUnit注释并在需要它们的方法中创建我的em更有意义。注入可以工作,但是当我尝试保留某些东西时,我仍然会遇到交易必需的异常!

所以我在这里问:这样做的正确方法是什么?

编辑:我正在使用默认设置的Jboss eap 6.2。我正在使用WEB-INF中的xml文件部署数据源,因此我正在使用JTA。


阅读 441

收藏
2020-06-20

共1个答案

一尘不染

我是个白痴。过去我已经遇到过这个问题,但是我忘记了。

对于每个在这里遇到相同问题的人,这里都是解决方案。容器管理的事务仅在容器是EJB时有效。如果容器是JSF,则不起作用!注入实体管理器的方式无关紧要,注入成功,但是创建的对象将不起作用。

解决该问题的方法是创建一个EJB DAO对象,该对象将为您处理数据库。就像是

@Named
@Stateless
public class MyDAO {

@PersistenceContext(unitName = "SRA")
private EntityManager em;

public void save(Object o) {
    em.persist(o);
    em.flush();
}

}

然后将这些对象注入托管bean中,如下所示:

@ManagedBean
@SessionScoped
public class MyManagedBean {
@EJB
private MyDAO dao;

public void action() {
....
    dao.save(o);
}

}

直接将EntityManager注入受管Bean将为您提供所需的交易异常。

我仍然不确定是否将类似的东西注入到范围更广的bean中。稍后我将对此进行研究。

2020-06-20