java - JPA 和 JSF : right way of injecting EntityManager

标签 java hibernate jsf jpa cdi

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

相关文章:

javascript - ckeditor拖放txt文件

java - 如何通过 d :date properties in Alfresco? 启用高级搜索

Java 线程,绿色还是原生?

java - 如何使各种 SWT RowLayout 内的所有按钮具有相同的宽度

java - 集成jsf、spring、hibernate。如何将 Spring bean 注入(inject) JSF 托管 bean 中?

java - 我无法使用 JSR303 @Valid 显示错误消息

database - 从 Hibernate 中的 java.sql.Blob 获取流

java - PrimeFaces 数据表初始 sortBy 不起作用

java - 如何识别 session 是否已过期以及当前页面

java - 使用 CDI 转换器进行 JSF selectOneMenu 实体转换失败