Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jpa entitymanager回滚不工作_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java jpa entitymanager回滚不工作

Java jpa entitymanager回滚不工作,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,在我的spring项目中,我使用hibernate entitymanager。我在项目中做了如下事务管理 applicationContext.xml <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.Oracle

在我的spring项目中,我使用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>
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语句后的代码中,我抛出了异常,因此应该回滚第一条语句。但在我的情况下,没有回滚。回滚需要其他配置吗


任何帮助都将不胜感激

您可以
捕获
异常
来记录它们,但随后,您会删除它们。不要那样做

异常在软件中的意义不仅限于日志记录,还包括它周围的所有框架


删除
try catch
块,这样方法周围的
@Transactional
特性就可以检测到错误并回滚事务。

正如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;
    }

谢谢Guillaume,删除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;
    }