Java jpa entitymanager回滚不工作
在我的spring项目中,我使用hibernate entitymanager。我在项目中做了如下事务管理 applicationContext.xmlJava 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
<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;
}