繁体   English   中英

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

[英]JPA and JSF: right way of injecting EntityManager

已经有几个小时我正在研究这个问题,但我还没弄清楚将JPA与JSF一起使用的正确方法是什么。

我有一个会话范围的托管bean,可以做很多事情,其中​​一个是持久化一些实体对象。 最初,我创建了一个生成器方法,请求作用域,构建我的EntityManager对象。 无论如何,这里读取将请求的scoped bean注入到会话范围的bean中,将该实例包装到Instance对象中。 完成。 但是当我尝试使用那个EM时,我得到了一个需要事务的异常。 继续在互联网上阅读有人告诉我必须使用PersistenceContext注释将EM直接注入我的托管bean。 无论如何,我认为使用persistenceUnit注释更有意义,并在我需要它们的方法中创建我的em。 注入工作,但当我试图坚持一些东西时,我仍然得到一个事务所需的异常!

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

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

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

对于每个在这里遇到同样问题的人来说,这就是解决方案。 Container Managed Transactions仅在容器是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注入Managed Bean将为您提供Transaction Required Exception。

我仍然不确定是否会将更类似的内容注入到更广泛的范围内的bean中。 我稍后会研究这个。

“有人告诉我必须使用PersistenceContext注释将EM直接注入我的托管bean。”

如果你看一下Java EE教程 ,那就是他们所做的

@Singleton
public class MyUserDatabaseEntityManager { 
    // declare a producer field 
    @Produces
    @UserDatabase
    @PersistenceContext
    private EntityManager em;
}

@ConversationScoped
@Stateful
public class RequestBean {

    @Inject
    @UserDatabase
    EntityManager em;

这可能无法完全回答您的问题,但希望它有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM