【问题标题】:JPA - Container Managed Persistence doesn't persist entity -JTAJPA - 容器管理持久性不持久实体 -JTA
【发布时间】:2013-05-13 21:25:58
【问题描述】:

我正在尝试将 Spring 和 JSF 集成到持久对象上。我不想处理事务(开始 - 提交等)

经过一番谷歌搜索后,我可以找到答案,给出我需要的in this link

我使用 eclipselink 作为 ORM 和 Oracle 11g 数据库以及带有 maven 的 Glassfish 服务器 3.1。 我更喜欢 Spring 配置的注释。我用

@Transactional
@Service

相关类中的注释。 我的 persistence.xml 名称是 E_DefterManagementPU,我的事务类型是 JTA。 这是我坚持 efaFunctions

的代码
public EntityManager entityManager;

@Inject
public void setEntityManager() {
    EntityManagerFactory emf = Persistence.
            createEntityManagerFactory("E_DefterManagementPU");
    this.entityManager = emf.createEntityManager();
}    

public void create(EfaFunctions efaFunctions) {              
    entityManager.persist(efaFunctions);  
}

实体管理器不为空,我可以看到 ** 为对象分配序列 ** 在 glassfish 上登录,但未生成其他日志,但如果我在下面编写代码,则不可见部分与 aboe 代码块相同;

public void create(EfaFunctions efaFunctions) {       
    entityManager.getTransaction().begin();
    entityManager.persist(efaFunctions);  
    entityManager.getTransaction().commit();
}

它持久化对象。 这可行,但我不想处理 begin() commit() 部分,并且根据 JTA Container Managed Persistence 的资源应该代替我这样做。任何人都可以告诉我我错在哪里提前谢谢

【问题讨论】:

  • 您是在 EJB(企业 Java Bean)的上下文中执行此操作吗?如果没有,则没有容器管理的事务,您必须在代码中管理事务(这确实没那么糟糕)。
  • 谢谢贝利,实际上我不使用 EJB,我正在尝试我的 Web 项目的这个服务层。我的 Bean 在上面,它们是 JSF ManagedBeans。没有任何关于 EJB 的知识,我希望我能正确定义.
  • 如果没有容器管理器,spring 如何在不管理事务的情况下处理事务。对不起,我没有受过教育,但我有一个 spring 项目,它使用下面的代码运行 protected Class<T> entityClass; @PersistenceContext protected EntityManager entityManager; @Override public T create(T t) { this.entityManager.persist(t); return t; }
  • 容器管理的事务是 EJB 规范的一部分。如果您不使用 EJB,则此功能根本不可用,与查看不起作用的“干净”代码相比,您会更乐意使用“杂乱”代码做一些事情。
  • 谢谢,我猜这也是最后一个 cmets 的答案

标签: java spring jpa persistence jta


【解决方案1】:

在 JSF 托管 bean 中,没有隐式事务。避免手动管理事务的唯一方法是在应用程序服务器中创建一个 EJB,并让 JSF 托管 bean 调用它来持久化数据。您正在使用 GlassFish,因此可以使用 EJB……但这绝对是一个新的复杂程度。处理持久性事务的一个好方法是使用这样的 try-catch 块模板:

    EntityManager em = ... //However you get an em.
    try {
        em.getTransaction().begin();

        // ...  Put your persistence code here.

        em.getTransaction().commit();
    } catch (Exception ex) {
        em.getTransaction().rollback();
        throw ex;
    }finally {
        em.close();
    }

它不像超级光滑的 CDI 和自动事务那样干净,但它会正确处理事务,并确保数据完整性。

【讨论】:

  • 谢谢!!!我明白了。但是我在我的项目中使用了一些 Spring 和一些 JSF。我引用了这个tutorial。这可以改变情况吗?我可以使用这个结构吗?
  • try-catch-finally 块在您拥有EntityManager 的任何编程环境中都可以很好地工作。如果您使用 Spring 注入 EntityManager,您可以放心地省略 finally {em.close();} 位,因为 Spring 会为您执行此操作。
  • 我在我的项目中使用 JSF 和 EJB 进行了切换,并且进展顺利。 ContainerManagedPersistence 使我的项目不需要 +Spring。
猜你喜欢
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2012-06-17
  • 2011-09-22
  • 2016-08-14
  • 1970-01-01
  • 2017-02-17
相关资源
最近更新 更多