I am using spring 3.0.5 and sleep mode 3.6. There is a scenario in my project when I have to roll back a transaction of any of the exceptions that occur or an error occurs. This is sample code, everything works fine, except that the transaction does not return when I throw an exception, but if any exception is thrown, for example mysql.IntegrityConstraintException , then the transaction rolls back, why doesnβt this happen in my case?
applicationContext.xml
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:database.properties"/> </bean> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="packagesToScan" value="com.alw.imps"/> <property name="configLocation"> <value> classpath:hibernate.cfg.xml </value> </property> </bean> <bean id="stateDao" class="com.alw.imps.dao.StateDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="stateService" class="com.alw.imps.services.StateService"> <property name="stateDao" ref="stateDao"></property> <property name="cityDao" ref="cityDao"></property> <property name="customerDao" ref="customerDao"></property> </bean> <bean id="customerDao" class="com.alw.imps.dao.CustomerDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="cityDao" class="com.alw.imps.dao.CityDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id = "txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice>
Service class StateService
@Transactional(rollbackFor={Exception.class}) public class StateService { private StateDaoImpl stateDao; private CityDao cityDao; private CustomerDao customerDao; public void setCustomerDao(CustomerDao customerDao) { this.customerDao = customerDao; } public void setStateDao(StateDaoImpl stateDao) { this.stateDao = stateDao; } public CityDao getCityDao() { return cityDao; } public void setCityDao(CityDao cityDao) { this.cityDao = cityDao; } public void addState() { try { State state=new State(); state.setStateName("Delhi"); stateDao.create(state); addCity(); addCustomer(); } catch(Exception e) { e.printStackTrace(); } } public void addCity() throws Exception { City city=new City(); city.setCiytName("Delhi"); city.setStateId(1); cityDao.create(city); } public void addCustomer() throws Exception { throw new java.lang.Exception(); }
DAO
public class StateDaoImpl extends GenericDaoImpl<State, Integer> implements StateDao { }
GenericDaoImpl
public class GenericDaoImpl<T,PK extends Serializable> implements GenericDao<T,PK> { public SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession() { return sessionFactory.getCurrentSession(); } public PK create(T o) { Session ss= getSession(); ss.save(o); return null; }
hibernate.cfg
<hibernate-configuration> <session-factory> <property name="connection.pool_size">1</property> <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="defaultAutoCommit">false</property> <mapping class="com.alw.imps.pojo.State"/> <mapping class="com.alw.imps.pojo.City"/> </session-factory> </hibernate-configuration>
Since I said that my problem is that the transaction is not getting rolled back when I selected an exception of type Exception from the addCustomer () method
source share