【发布时间】:2014-10-20 13:37:11
【问题描述】:
我的 DAO 界面很简单:
import org.springframework.transaction.annotation.Transactional;
@Component
@Transactional
public interface TTestDao {
@Transactional()
public void first();
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void second() ;
}
ad impl 方法:
@Override
public void first() {
entityManager.persist(new TableTest1().setName("data1"));
this.second();
}
public void second() {
entityManager.persist(new TableTest1().setName("data2"));
throw new RuntimeException(); // it roll backs data2 and data1
}
第一种方法调用第二种方法。第二种方法出现错误。
目前,如果我调用first(),所有持久化的信息都将被回滚。但是为什么会这样呢? second() 方法在新事务中,我需要将第一个方法的数据保留在数据库中。
换句话说,我需要始终保留第一个方法的数据,但只回滚第二个方法的数据。我想一直写data1。
我有什么问题吗?
我在 SPRING 中有这样一个 db 配置:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="oracle.jdbc.driver.OracleDriver" p:url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
p:username="dev" p:password="****" >
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<context:component-scan base-package="ge.ddrc.transport.persistance.entity">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
我的应用程序在 tomcat 中运行(如果有任何意义)
【问题讨论】: