I am user hibernate3.0、spring 1.2.4,
applicatoncontext.xml
IUserInfoDao.javaCode:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>init.properties</value> </property> </bean> <!-- Choose the dialect that matches your "dataSource" definition --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${datasource.driverClassName}</value> </property> <property name="url"> <value>${datasource.url}</value> </property> <property name="username"> <value>${datasource.username}</value> </property> <property name="password"> <value>${datasource.password}</value> </property> <property name="maxActive"> <value>${datasource.maxActive}</value> </property> <property name="maxIdle"> <value>${datasource.maxIdle}</value> </property> <property name="maxWait"> <value>${datasource.maxWait}</value> </property> <!--property name="defaultAutoCommit"> <value>${datasource.defaultAutoCommit}</value> </property--> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource"/> </property> <property name="mappingResources"> <list> <value>cn/anjia66/pojo/Userdetailinfo.hbm.xml</value> <value>cn/anjia66/pojo/Userinfo.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop> <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="userInfoService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="target" ref="userInfoServiceTarget"/> <property name="transactionAttributes"> <props> <prop key="saveUser">PROPAGATION_NESTED</prop> <prop key="createUser">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="userInfoDao" class="cn.anjia66.dao.hibernate.UserInfoHibernateDao"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="globeContext" class="cn.anjia66.spring.util.GlobeContext"/> <bean id="userDetailInfoDao" class="cn.anjia66.dao.hibernate.UserDetailInfoHibernateDao"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="userInfoServiceTarget" class="cn.anjia66.business.impl.UserInfoServiceImpl"> <property name="userInfoDao"> <ref local="userInfoDao"/> </property> <property name="userDetailInfoDao"> <ref local="userDetailInfoDao"/> </property> </bean> </beans>
IUserDetailInfoDao.javaCode:package cn.anjia66.dao; import cn.anjia66.pojo.Userinfo; public interface IUserInfoDao { public Userinfo saveUserInfo(Userinfo ui); }
UserInfoHibernateDao.javaCode:package cn.anjia66.dao; import cn.anjia66.pojo.Userdetailinfo; public interface IUserDetailInfoDao { public Userdetailinfo saveUserDetailInfo(Userdetailinfo ud); }
UserDetailInfoHibernateDao.javaCode:package cn.anjia66.dao.hibernate; import cn.anjia66.dao.IUserInfoDao; import cn.anjia66.pojo.Userinfo; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.dao.DataAccessException; public class UserInfoHibernateDao extends HibernateDaoSupport implements IUserInfoDao { public Userinfo saveUserInfo(Userinfo ui) throws DataAccessException { getHibernateTemplate().saveOrUpdate(ui); return ui; } }
IUserInfoService.javaCode:package cn.anjia66.dao.hibernate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.dao.DataAccessException; import cn.anjia66.dao.IUserDetailInfoDao; import cn.anjia66.pojo.Userdetailinfo; public class UserDetailInfoHibernateDao extends HibernateDaoSupport implements IUserDetailInfoDao { public Userdetailinfo saveUserDetailInfo(Userdetailinfo ud) throws DataAccessException { getHibernateTemplate().saveOrUpdate(ud); return ud; } }
UserInfoServiceImpl.javaCode:package cn.anjia66.business; import cn.anjia66.pojo.Userinfo; import cn.anjia66.pojo.Userdetailinfo; public interface IUserInfoService { public Userinfo saveUserInfo(Userinfo ui); public boolean saveUser(Userinfo ui,Userdetailinfo ud); public boolean createUser(Userinfo ui,Userdetailinfo ud); }
TestUserInfoService.javaCode:package cn.anjia66.business.impl; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataRetrievalFailureException; import cn.anjia66.business.IUserInfoService; import cn.anjia66.dao.IUserDetailInfoDao; import cn.anjia66.dao.IUserInfoDao; import cn.anjia66.pojo.Userdetailinfo; import cn.anjia66.pojo.Userinfo; public class UserInfoServiceImpl implements IUserInfoService { private IUserInfoDao userInfoDao; private IUserDetailInfoDao userDetailInfoDao; public IUserDetailInfoDao getUserDetailInfoDao() { return userDetailInfoDao; } public void setUserDetailInfoDao(IUserDetailInfoDao userDetailInfoDao) { this.userDetailInfoDao = userDetailInfoDao; } public void setUserInfoDao(IUserInfoDao userInfoDao) { this.userInfoDao = userInfoDao; } public IUserInfoDao getUserInfoDao() { return this.userInfoDao; } public Userinfo saveUserInfo(Userinfo ui) { return getUserInfoDao().saveUserInfo(ui); } public Userdetailinfo savaUserDetailInfo(Userdetailinfo ud) { return getUserDetailInfoDao().saveUserDetailInfo(ud); } public boolean saveUser(Userinfo ui, Userdetailinfo ud){ ui = this.saveUserInfo(ui); ud.setUserid(ui.getId()); createUser(ui, ud); this.savaUserDetailInfo(ud); return true; } public boolean createUser(Userinfo ui, Userdetailinfo ud){ ui = this.saveUserInfo(ui); ud.setUserid(ui.getId()); this.savaUserDetailInfo(ud); //throw new DataRetrievalFailureException("test"); return true; } }
I did test Case to testSaveUser() method,Code:package cn.anjia66.business; import junit.framework.TestCase; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.anjia66.pojo.Userdetailinfo; import cn.anjia66.pojo.Userinfo; public class TestUserInfoService extends TestCase { private IUserInfoService uiService; /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); uiService = (IUserInfoService) appContext.getBean("userInfoService"); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); } public void testSaveUser() { Userinfo ui = new Userinfo(); Userdetailinfo ud = new Userdetailinfo(); ui.setName("david"); ui.setSex("man"); ud.setAge(Integer.valueOf(28)); ud.setHeight(Integer.valueOf(178)); uiService.saveUser(ui, ud); // uiService.createUser(ui,ud); } }
I expect that throw exception ,rollback transactions and no data record inserted into the DB,but have not throw exception and the only one data record inserted int the DB,other data record did not inserted into the DB?
what's wrong here?
other,
I modified UserInfoServiceImpl.java ,follow:
and modified applicationcontext.xml,follow partly code:Code:package cn.anjia66.business.impl; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataRetrievalFailureException; import cn.anjia66.business.IUserInfoService; import cn.anjia66.dao.IUserDetailInfoDao; import cn.anjia66.dao.IUserInfoDao; import cn.anjia66.pojo.Userdetailinfo; import cn.anjia66.pojo.Userinfo; public class UserInfoServiceImpl implements IUserInfoService { private IUserInfoDao userInfoDao; private IUserDetailInfoDao userDetailInfoDao; public IUserDetailInfoDao getUserDetailInfoDao() { return userDetailInfoDao; } public void setUserDetailInfoDao(IUserDetailInfoDao userDetailInfoDao) { this.userDetailInfoDao = userDetailInfoDao; } public void setUserInfoDao(IUserInfoDao userInfoDao) { this.userInfoDao = userInfoDao; } public IUserInfoDao getUserInfoDao() { return this.userInfoDao; } public Userinfo saveUserInfo(Userinfo ui) { return getUserInfoDao().saveUserInfo(ui); } public Userdetailinfo savaUserDetailInfo(Userdetailinfo ud) { return getUserDetailInfoDao().saveUserDetailInfo(ud); } public boolean saveUser(Userinfo ui, Userdetailinfo ud){ ui = this.saveUserInfo(ui); ud.setUserid(ui.getId()); createUser(ui, ud); throw new DataRetrievalFailureException("test"); return true; } public boolean createUser(Userinfo ui, Userdetailinfo ud){ ui = this.saveUserInfo(ui); ud.setUserid(ui.getId()); this.savaUserDetailInfo(ud); //throw new DataRetrievalFailureException("test"); return true; } }
I did test case to testSaveUser() method,Code:<bean id="userInfoService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="target" ref="userInfoServiceTarget"/> <property name="transactionAttributes"> <props> <prop key="saveUser">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
I expect that throw exception ,rollback transactions and no data record inserted into the DB,
but only have throw exception and the data record inserted into the DB?
what's wrong right here?
Thank you for anywhere refrence.
Regard.
David


Reply With Quote