2011-03-05 140 views
6

我了解在此之前已经询问过类似问题,但找不到解决方案。基本上,我试图在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"/> 
+0

删除rollbackFor = DataAccessException.class和带有try catch的surround dao调用以进行调试 – blob 2011-03-05 14:09:57

回答

1

请注意您的配置中的mode="aspectj"。它需要额外的配置,通常你不应该使用它,除非你明白它是什么意思,你为什么需要它。见10.5.6 Using @Transactional

+0

虽然答案并不直接解决问题,但我认为“aspectj”及其相关配置(做加载时织造)是问题的罪魁祸首。谢谢你的帮助。 – Oliver 2011-03-05 22:27:33

1

,看起来像一个潜在的问题是你的传播设置的第一件事情。这里是证明文件,你可以指定值:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/annotation/Propagation.html

请注意,您所指定的支承着“支持当前事务,执行非事务如果不存在”。您可能希望使用REQUIRED,这是默认设置,并且可以使用现有事务,或者创建一个当前不存在的事务。

+0

首先,thx用于答复。虽然你的建议是有道理的,但我尝试了传播所需,它似乎没有什么区别。另外,我从Apress的书“Spring JPA的持久性”中得到的原始设置 - 但是这本书中存在许多错字/不一致之处,我也不会在这个设置上下注。 – Oliver 2011-03-05 05:19:32

0

在我的情况:

使用JPA与Spring MVC - 我所有的测试和代码没有错误运行良好 - 症状是提交将根本就没有保存到数据库中,无论是我的尝试。

我必须在我的情况下加 我的applicationContext.xml和CGLIB的节点p-2.1_3.jar aopalliance-1.0.jar

绝对的修补程序。没有注释驱动Spring不会扫描@Transactional注释