JPA和JSF:注入EntityManager的正确方法
我已经花了几个小时来解决这个问题,但仍然没有弄清楚将JPA与JSF一起使用的正确方法。
我有一个会话范围的托管bean,它可以完成很多事情,其中之一是保留一些实体对象。在开始时,我创建了一个生产者方法,该方法以请求为范围,用于构建EntityManager对象。无论如何,将请求的范围内的bean注入到会话范围内的bean的读操作已经完成了将该实例包装到Instance对象中。做完了
但是,当我尝试使用该EM时,出现了需要交易的异常。继续在互联网上阅读,有人告诉我必须使用PersistenceContext批注将EM直接注入到我的托管bean中。无论如何,我认为使用persistenceUnit注释并在需要它们的方法中创建我的em更有意义。注入可以工作,但是当我尝试保留某些东西时,我仍然会遇到交易必需的异常!
所以我在这里问:这样做的正确方法是什么?
编辑:我正在使用默认设置的Jboss eap 6.2。我正在使用WEB-INF中的xml文件部署数据源,因此我正在使用JTA。
回答:
我是个白痴。过去我已经遇到过这个问题,但是我忘记了。
对于每个在这里遇到相同问题的人,这里都是解决方案。容器管理的事务仅在容器是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中。稍后我将对此进行研究。
以上是 JPA和JSF:注入EntityManager的正确方法 的全部内容, 来源链接: utcz.com/qa/411432.html