Spring + JPA @Transactional未提交

5
我知道类似的问题之前在这里已经被问过,但我找不到解决我的问题的方法。基本上,我正在尝试通过Spring中的Hibernate使用JPA,但由于某种原因数据没有被持久化。在Spring事务调试中打开后,没有发现任何问题-EntityManager打开和关闭,但就事务管理器而言,没有任何显示...我确定我错过了一些重要的东西,任何帮助都将不胜感激!请参阅以下详情。
TIA
奥利弗
基本布局如下:类FooDaoJPA的保存函数调用entityManager.persist(object)以持久化对象。
类FooServiceImpl通过实现服务接口来实现服务接口:
@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"/>

移除 rollbackFor = DataAccessException.class,并且为了调试目的,在 dao 调用周围加上 try catch。 - Dhananjay
3个回答

1

看起来可能有潜在问题的第一件事是您的传播设置。这里是文档显示您可以指定的值:

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

请注意,您已经指定了“SUPPORTS”,它“支持当前事务,在不存在事务的情况下执行非事务性操作”。您可能想要使用默认值“REQUIRED”,它将使用现有的事务或在当前不存在事务时创建一个新的事务。

首先,感谢您的回复。虽然您提出的建议很有道理,但我已经尝试了传播所需,似乎并没有什么区别。此外,我从Apress书籍《Spring Persistence with JPA》中获取了原始设置,但该书存在相当多的错别字/不一致之处,我也不会把赌注压在上面。 - Oliver

1
请注意配置中的mode="aspectj"。它需要额外的配置,通常情况下,除非您理解其含义及所需原因,否则不应使用它。请参见10.5.6 使用 @Transactional

虽然这个答案并没有直接解决问题,但我认为“aspectj”及其相关配置(进行加载时织入)是问题的罪魁祸首。感谢您的帮助。 - Oliver

0
在我的情况下:
使用Spring MVC的JPA - 所有测试和代码都能正常运行,没有错误 - 症状是无论我尝试什么,提交都不会保存到数据库。
我不得不在我的applicationContext.xml中添加,以及cglib-nodep-2.1_3.jar和aopalliance-1.0.jar。
这绝对是我的解决方法。如果没有注释驱动的Spring,它将不会扫描@Transactional注释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接