急急急 急急急 SpringJDBC 声明式事物不回滚 求大家帮忙看看
basedao
public class BaseDao<T, PK extends Serializable> extends JdbcDaoSupport{
/**
* 添加 ,属性和数据库字段名一致,返回主键
* @param objForSave ,继承Saveable 的接口的类
* @return
*/
public Number saveAndReturnKey(Saveable objForSave){
return saveAndReturnKey(objForSave, objForSave.getTableName(), objForSave.getKeyColumns());
}
/**
* 添加实体,返回主键
* @param objForSave
* @param tableName
* @param columnAndValue
* @param keyColumns
* @return
*/
public Number saveAndReturnKey(Object objForSave,String tableName,String...keyColumns){
SimpleJdbcInsert insertActor = getSimpleJdbcInsert();
insertActor.setTableName(tableName);
insertActor.usingGeneratedKeyColumns(keyColumns);
Number newId = insertActor.executeAndReturnKey(new BeanPropertySqlParameterSource(objForSave)) ;
traceSql(insertActor.getInsertString());
return newId;
}
* 更新数据的方法
* @param sql
* @param T entity
*/
public void update(String sql,T entity){
getJdbcTemplate().update(sql,entity);
}
}
@Repository("userMgrDao")
@SuppressWarnings("unchecked")
public class UserMgrDao extends BaseDao{
//添加一个用户
public Users addUser(final Users users){
users.setId(saveAndReturnKey(users).intValue());
return users;
}
/**
* 删除数据的方法
* @param id
*/
public void delete(String id){
String sql = "delete from users where id=?";
update(sql, id);
}
}
@Service("userMgrService")
@Transactional
public class UserMgrService extends BaseService implements IUserMgrService{
public UserMgrService(){
}
private static Logger logger = Logger.getLogger(UserMgrService.class);
@Autowired
private UserMgrDao userMgrDao;
@Transactional(rollbackFor=Throwable.class)
public void save(Users user) throws ServiceException {
try {
user.setImportdate(new Date());
user.setFast(1L);
user.setUpdatedate(new Date());
user.setImportuserid(1L);
user.setUpdateuserid(1L);
userMgrDao.addUser(user);
}catch (Exception e) {
throw new ServiceException("获取失败", e);
}
}
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
public void delete(String id){
try {
userMgrDao.delete(id);
} catch (Exception e) {
logger.error(e);
}
}
}
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-autowire="byName">
<!-- 如果有多个 DispatcherServlet 请把关于数据库和server部分的bean在web.xml中使用spring 的 listener加载-->
<!-- 自动扫描controller bean,把作了注解的类转换为bean -->
<!-- 自动扫描组件,这里要把web下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。-->
<context:component-scan base-package="com.dahua" >
<context:exclude-filter type="regex" expression="com.dahua.module.usermgr.controller.*"/>
</context:component-scan>
<!-- 事务 -->
<bean id="transactionManager"
ref="dataSource" />
</bean>
<!-- 加载jdbc.properties文件 -->
<bean id="propertyConfigurer"
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}"/>
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="maxIdle" value="15" />
<property name="minIdle" value="5" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="180" />
<property name="defaultAutoCommit" value="false" />
</bean>
<!-- 声明使用注解式事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
测试方法:
@Test
public void testList() {
try {
//全部用户
List<Users> list=iuserMgrService.getUsers();
//按某个字段查找
for(Users u:list){
//System.out.println(u.getLoginname()+"--------"+u.getCoding());
}
Users user1 = new Users();
user1.setLoginname("111");
user1.setUsername("111");
user1.setCoding("11");
iuserMgrService.save(user1);
Users user2 = new Users();
//user2.setLoginname("111");
//user2.setUsername("111");
//user2.setCoding("11");
iuserMgrService.delete("3487");
iuserMgrService.delete("3487");
iuserMgrService.save(user2);
/*System.out.println("用户数量:"+list.size());
Users users=userMgrService.getUserByUserName("沈为人");
System.out.println(users.getLoginname()+"--------"+users.getCoding());
Users users1=userMgrService.getUserById(1);
System.out.println(users1.getLoginname()+"--------"+users1.getCoding());*/
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
loginname 不可为空 添加第二个报错 但是添加和删除操作没有回滚
数据库是mysql 表示:InnoDB