JPA - 容器管理持久性不会持久化实体-JTA

时间:2013-05-13 21:25:58

标签: java spring jpa persistence jta

我试图整合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容器管理持久性的资源应该这样做而不是我。任何身体都可以告诉我我错在哪里提前谢谢

1 个答案:

答案 0 :(得分: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和自动交易一样整洁,但它会正确处理交易,并确保数据完整性。