我已经花了几个小时来解决这个问题,但仍然没有弄清楚将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中。稍后我将对此进行研究。