jpa entitymanager rollback无法正常工作

时间:2017-11-15 05:41:30

标签: java spring hibernate jpa

在我的春季项目中,我使用的是hibernate entitymanager。我在项目中完成了如下的事务管理。

的applicationContext.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@xxxx:1527:selva" />
        <property name="username" value="xxx" />
        <property name="password" value="yyy" />
</bean>
<bean
            class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan">
                <list>
                    <value>com.selva.entity</value>
                </list>
            </property>
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="ORACLE" />
                    <property name="showSql" value="true" />
                </bean>
            </property>
        </bean>
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>

TestTranService.java

@Transactional
    public String checkTranWork() {
        try {
            testTranDao.method1();
            int i=0;
            if(i==0)
                throw new ValidationException();
            testTranDao.method2();
            testTranDao.method3();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

TestTranDaoImpl.java

public class TestTranDaoImpl implements TestTranDao {

    public static final Logger LOGGER = Logger
            .getLogger(TestTranDaoImpl.class);

    @PersistenceContext
    private EntityManager entityManager;

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    @Override
    public void method1() {
        try {
            String sql = "INSERT INTO CUST(MOBNUM,CUST_NAME) values ('1','dd')";
            Query query = entityManager.createNativeQuery(sql);
            query.executeUpdate();
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void method2() {
try {
    String sql = "INSERT INTO CUST(MOBNUM,CUST_NAME) values ('1','dd')";
    Query query = entityManager.createNativeQuery(sql);
    query.executeUpdate();
        } catch(Exception e) {
            e.printStackTrace();
        }


    }



}

在方法1执行insert语句之后的代码中,我抛出异常,因此应该回滚第一个语句。但在我的情况下,回滚没有发生。它是回滚所需的任何其他配置。

任何帮助将不胜感激!!!

2 个答案:

答案 0 :(得分:1)

Catch Exceptions要记录它们,但是,您放弃它们。别这么做!

Exception在软件中有意义,不仅仅是日志记录,也适用于它周围的所有框架。

移除try catch块,以便您的方法周围的@Transactional Aspect可以检测到错误并回滚您的交易。

答案 1 :(得分:0)

正如Gillaume所解释的那样@Transactional工作,该方法必须抛出异常,然后只有框架知道必须执行rollback。 已经提出的一个解决方案是删除try/catch,如果需要捕获异常并登录应用程序错误日志文件,请确保传播的异常未被消耗。 所以更新后的代码如下:

@Transactional
    public String checkTranWork() {
        try {
            testTranDao.method1();
            int i=0;
            if(i==0)
                throw new ValidationException();
            testTranDao.method2();
            testTranDao.method3();
        } catch(Exception e) {
            e.printStackTrace();
            throw e;
        }
        return null;
    }