我看过很多问题,但他们所有的解决方案仍然不明确。 这是我的设置 我的Spring Context文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
..
...
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
...
...
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="entityManagerFactory1"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
autowire="byName">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="packagesToScan" value="com.my.dom.domain" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle10gDialect
</prop>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">10</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="persistenceUnitName" value="PersistenceUnit1"></property>
</bean>
<bean id="EntityManagerFactory2"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
autowire="byName">
<property name="dataSource" ref="myDataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="packagesToScan" value="com.my.dom.domain" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.H2Dialect
</prop>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">10</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
..
...
<bean id="entityManager1" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>
<tx:annotation-driven transaction-manager="entityManager1" />
<bean id="EntityManager2" factory-bean="EntityManagerFactory2" factory-method="createEntityManager" autowire="byName" scope="prototype"/>
<tx:annotation-driven transaction-manager="EntityManager2" />
<context:component-scan base-package="com.my.dom" />
<jpa:repositories base-package="com.my.dom.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
</beans>
所有数据源和其他连接bean都已就位并正常工作。
我的DAO代码如下 包com.my.dom.dao;
@Component
public class MyDAOImpl implements MyDAO {
@PersistenceContext(unitName="PersistenceUnit1")
EntityManager entityManager; // this is IAR EntityManager.
@Override
@Transactional
public boolean saveMyGroups(
List<MyGroups> theGroups) {
logger.info("Entering method - saveFuturetheGroups ");
//entityManager.getTransaction().begin();
for(MyGroups pg : theGroups){
MyGroups attachedENtity = entityManager.merge(pg);
entityManager.persist(pg);
}
//entityManager.getTransaction().commit();
entityManager.flush();
logger.info("Exiting method - saveFuturetheGroups ");
//List<MyGroups> savedEntities = futureProcGrpRepository.save(theGroups);
return true;
}
}
我在Spring+JPA @Transactional not committing 中建议的类路径中包含所有cglib和aopalliance1.0.jars
我的代码仍未将更改提交给DB。任何帮助指针都会非常有用。
代码显示select和insert sql语句,没有异常抛出但代码不提交。 @Transactional注释中是否有任何问题?
可以在这里定义多个实体管理员吗?
好的,我发现如果我使用的话 @Transactional(传播= Propagation.REQUIRES_NEW)
在我的方法之上它提交更改!但根据我的原因,传播的默认值是'REQUIRED'哪个方式会开始一个新的转换并且应该在结束时提交?任何指针我现在真的很困惑!!
由于 HK
请注意,我是从A Junit测试用例运行的,是否有可能明显地回滚更改?我在日志中看到类似的内容
INFO : org.springframework.test.context.transaction.TransactionalTestExecutionListener - Rolled back transaction after test execution for test context [[TestContext@a5503a testClass = ProcessingGroupsTestCase, testInstance = null(com.wellmanage.dos.processingGroups.ProcessingGroupsTestCase), testMethod = testSave@ProcessingGroupsTestCase, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@1363f5a testClass = ProcessingGroupsTestCase, locations = '{classpath:applicationContext.xml}', classes = '{}', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader']]]
由于 HK
答案 0 :(得分:4)
好的伙计!!这是我的愚蠢......我相信我应该承认。我一直在通过我的TestCase运行整个DAO和服务,我只是在我的TestCase中忽略了以下内容。
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@Transactional
defaultRollback = true是罪魁祸首。
我学到了什么教训。永远不要忽视任何代码,并始终尝试从代码的开头找到问题。
所以让Spring使用JPA - 有适当的上下文条目(如我的例子) - 在我的DAO中使用@Transactional。
你应该全力以赴。
由于 HK
答案 1 :(得分:2)
默认情况下,对于junit测试,defaultRollback设置为true,这意味着,即使您未指定@TransactionConfiguration,也将回滚通过junit测试更新的数据。
显式设置defaultRollback = false将解决此问题。
@TransactionConfiguration(transactionManager =“transactionManager”,defaultRollback = false)
答案 2 :(得分:0)
您要在代码上指定您的交易管理器
@Transactional("entityManager1")
public boolean saveMyGroups(
答案 3 :(得分:0)
在我的情况下,你只是不想在测试本身(或它所在的类)上放置@Transactional注释,它将解决问题,而不必包括:
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
这可能会使单元测试变得困难,并且默认情况下是“真实的”,这是有充分理由的。
所以只需制作你的控制器层方法@Transactional并且不要在测试中这样做 - 他们会看到修改后的数据。