【问题标题】:JPA and JSF: right way of injecting EntityManagerJPA和JSF:注入EntityManager的正确方法
【发布时间】:2014-01-31 11:58:31
【问题描述】:

我已经为此工作了几个小时,但我仍然没有弄清楚将 JPA 与 JSF 结合使用的正确方法是什么。

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

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

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

【问题讨论】:

  • 你的运行环境是什么?如果您只使用 servlet 容器或成熟的 Java EE 服务器,这很重要。
  • 除了@Yuri 所说的,this tutorial chapter 解释了为什么知道您是否使用 JavaEE 很重要。

标签: java hibernate jsf jpa cdi


【解决方案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 直接注入托管 Bean 会给您一个 Transaction Required 异常。

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

【讨论】:

  • 对于 JSF 2.0+,我建议不要混合使用 @Named@ManagedBean - 并坚持使用 @Named。另外我建议坚持使用 CDI 范围而不是 JSF 版本(仔细检查完整的包名)。
【解决方案2】:

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

如果您查看Java EE tutorial,他们就是这样做的

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

@ConversationScoped
@Stateful
public class RequestBean {

    @Inject
    @UserDatabase
    EntityManager em;

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

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 2016-06-07
    • 2017-04-07
    • 1970-01-01
    • 2016-08-06
    • 2016-01-30
    • 2015-05-02
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多