在java中使用JpaTemplate处理事务?

时间:2010-12-27 22:22:02

标签: java spring jpa

我已经开始考虑使用JpaTemplate在我的一些应用程序中删除一些样板代码的可能性。

我现在有这样的事情:

public class SomeDaoClass {

    public SomeDaoClass( boolean handleTransactionsLocally ) {
            _handleTransactionsLocally = handleTransactionsLocally;
    }

    private void persist( final Object object ) throws MyCustomException {
        try {
            if ( _handleTransactionsLocally ) {
                EntityTransaction transaction = getEntityManager().getTransaction();

                transaction.begin();
                getEntityManager().persist( object );
                transaction.commit();
            }
            else {
                getEntityManager().persist( object );
                getEntityManager().flush();
            }
        }
        catch ( Exception exception ) {
            throw new MyCustomException( exception );
        }
    }
}

从单元测试运行时,我覆盖getEntityManager()并为构造函数提供true。当我将其部署到服务器时,我只是从容器中返回注入的实体管理器。

然而,似乎我应该能够做这样的事情:

        _jpaTemplate = new JpaTemplate( getEntityManager() );
        _jpaTemplate.persist( object );

如何在java代码中指定jpaTemplate应如何处理事务?我尝试用@Transactional注释方法,但这似乎不起作用。我需要在_jpaTemplate上设置属性吗?这甚至可能吗?

TIA

2 个答案:

答案 0 :(得分:1)

除了添加@Transactional之外,您需要在<tx:annotation-driven />中指定applicationContext.xml,并且还有一个名为transactionManager的bean,(在您的情况下)是类型的org.springframework.orm.jpa.JpaTransactionManager

作为旁注 - 使DAO事务处理通常不是一个好主意。你最好让你的服务层事务处理。

答案 1 :(得分:1)

除了Bozho的回答,你实际上不需要使用JpaTemplate来获得声明性交易。

在Spring中使用JPA和声明性事务的典型方法是使用注入EntityManager注释字段的共享@PersistenceContext。请参阅13.5.2 Implementing DAOs based on plain JPA