我已经开始考虑使用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
答案 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。