Spring + JPA @Transactional没有提交
我了解在此之前已经询问过类似问题,但找不到解决方案。基本上,我试图在Spring中通过Hibernate使用JPA,但数据是而不是由于某种原因被持久化。在spring事务上调试时没有显示任何内容 - EntityManager打开和关闭,但没有任何事情显示出事务管理器的问题...我相信我错过了一些大事,任何帮助表示赞赏!请参阅以下内容了解更多详情。Spring + JPA @Transactional没有提交
TIA
奥利弗
基本布局如下:类FooDaoJPA
的保存功能调出entityManager.persist(object)
坚持的对象。
类通过实现服务接口:
@Transactional(rollbackFor = DataAccessException.class,
readOnly = false, timeout = 30,
propagation = Propagation.SUPPORTS,
isolation = Isolation.DEFAULT)
public void saveFoo(Foo foo) throws DataAccessException {
fooDao.save(foo);
}
注意到fooDao
由Spring IoC来注入
最后控制器注入了FooService
并呼吁saveFoo()
留存数据。
JPA配置
<!-- JPA Entity Manager Factory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="feDataSource"/>
<!-- Transaction Config -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>
<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager"/>
请注意您的配置中的mode="aspectj"
。它需要额外的配置,通常你不应该使用它,除非你明白它是什么意思,你为什么需要它。见10.5.6 Using @Transactional。
虽然答案并不直接解决问题,但我认为“aspectj”及其相关配置(做加载时织造)是问题的罪魁祸首。谢谢你的帮助。 – Oliver 2011-03-05 22:27:33
,看起来像一个潜在的问题是你的传播设置的第一件事情。这里是证明文件,你可以指定值:
请注意,您所指定的支承着“支持当前事务,执行非事务如果不存在”。您可能希望使用REQUIRED,这是默认设置,并且可以使用现有事务,或者创建一个当前不存在的事务。
首先,thx用于答复。虽然你的建议是有道理的,但我尝试了传播所需,它似乎没有什么区别。另外,我从Apress的书“Spring JPA的持久性”中得到的原始设置 - 但是这本书中存在许多错字/不一致之处,我也不会在这个设置上下注。 – Oliver 2011-03-05 05:19:32
在我的情况:
使用JPA与Spring MVC - 我所有的测试和代码没有错误运行良好 - 症状是提交将根本就没有保存到数据库中,无论是我的尝试。
我必须在我的情况下加 我的applicationContext.xml和CGLIB的节点p-2.1_3.jar aopalliance-1.0.jar
绝对的修补程序。没有注释驱动Spring不会扫描@Transactional注释
删除rollbackFor = DataAccessException.class和带有try catch的surround dao调用以进行调试 – blob 2011-03-05 14:09:57