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

 手机用户2602905667 发布于 2023-01-30 10:42

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

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

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

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

1 个回答
  • 我是个白痴.我过去已经遇到过这个问题,但我忘记了.

    对于每个在这里遇到同样问题的人来说,这就是解决方案.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中.我稍后会研究这个.

    2023-01-30 10:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有