老师,我添加了事务还是会把商品的分类变为空

老师,我添加了事务还是会把商品的分类变为空

package com.imooc.service.impl;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import com.imooc.dao.CategoryDao;
import com.imooc.dao.ProductDao;
import com.imooc.dao.impl.CategoryDaoImpl;
import com.imooc.dao.impl.ProductDaoImpl;
import com.imooc.domain.Category;
import com.imooc.domain.Product;
import com.imooc.service.CategoryService;
import com.imooc.utils.JDBCUtils;

public class CategoryServiceImpl implements CategoryService {

	@Override
	public List<Category> findAll() {
		//调用CategoryDao的方法
		System.out.println("CategoryService的findAll方法执行了");
		CategoryDao categoryDao=new CategoryDaoImpl();
		return categoryDao.findAll();
	}

	@Override
	public void save(Category category) {
		CategoryDao categoryDao=new CategoryDaoImpl();
		categoryDao.save(category);
		
	}

	@Override
	public Category findOne(Integer cid) {
		CategoryDao categoryDao=new CategoryDaoImpl();		
		return categoryDao.findOne(cid);
	}

	@Override
	public void update(Category category) {
		CategoryDao categoryDao=new CategoryDaoImpl();	
		categoryDao.update(category);
	}

	@Override
	public void delete(Integer cid) {
		/**
		 * 事务管理:在业务层统一创建连接对象,保证对个DAO中使用同一个连接
		 * *1.创建连接之后,将连接对象传递给DAO
		 * *2.创建一个连接对象,将连接绑定到当前线程中(ThreadLocal)
		 */
		Connection conn=null;
		try {
			conn=JDBCUtils.getConnection();
			//开启事务:
			conn.setAutoCommit(false);
		//要在删除分类之前,先将所属该分类的商品先处理一下
		ProductDao productDao=new ProductDaoImpl();
		List<Product> list=productDao.findByCid(cid);
		for(Product product:list) {
			product.getCategory().setCid(null);
			productDao.update(conn,product);
		}
		
		int d=1/0;
		
		//删除分类:
		CategoryDao categoryDao=new CategoryDaoImpl();	
		categoryDao.delete(conn,cid);
		//提交事务:
		conn.commit();
		}catch(Exception e) {			
			//回滚事务:		
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally {
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}


}


为什么商品分类还是会变空呢,分类没有变

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好。

1、事务回滚是指的是将开启事务后的,也就是conn.setAutoCommit(false);之后的所有数据库操作回滚。所以productDao.update(conn,product);会失效,也就是相关的product的数据中cid并没有改变为null。可以理解是"product.getCategory().setCid(null);"也回滚

2、同学的测试方法是否和老师视频中的一致呢?将同学贴的代码放入老师源码中,使用视频中的方式重新进行了测试,报了除以0异常,并且事务正常回滚,风景画分类仍然存在,cid为2的product也没有变为null哦~

同学可以开启debug模式,分别在conn.setAutoCommit(false);  int d=1/0;打一下断点,看一下在开启事务前是否已经发生了异常,或者对异常是否进行了其他捕获导致其没有进行conn.rollback();

祝学习愉快~

  • 慕UI5285863 提问者 #1
    不知道为什么又可以了,谢谢老师
    2019-10-07 21:28:09
  • 芝芝兰兰 回复 提问者 慕UI5285863 #2
    有时候可能是缓存问题呢~所以有些时候重启Tomcat或者编辑器就又管用了呢~同学下次遇到奇怪的问题,代码很确定的时候,不放试一下~祝学习愉快~
    2019-10-08 10:18:30
提问者 慕UI5285863 2019-10-06 04:12:42

回滚事务也包括把"product.getCategory().setCid(null);"这句话也回滚吗?但是出现异常商品分类还是为空

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师