gpt4 book ai didi

java - JPA 和 JSF : right way of injecting EntityManager

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:07 29 4
gpt4 key购买 nike

我已经为此工作了几个小时,但我仍然没有弄清楚将 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com