Spring事务机制以及异常的处理(正确版)

如图 想添加一位学生 前台规划如图所示所需学生姓名,学号,学院,班级,年级,性别,公寓以及宿舍名

学生表构造如下

外键对应班级id,宿舍id,宿舍表中管理公寓id,学院id

前台点击按钮事件绑定方法

$(document).ready(function() {
	//增加学生提交
	$("#addStudSub").click(function self() {
		// 禁用按钮
		$("#addStudSub").addClass('disabled');
		// 学院
		var coll = $("#seleColl").val();
		// 班级
		var clas = $("#seleClas").val();
		// 年级
		var grad = $("#seleGrade").val();
		// 性别
		var sex = $("#seleSex").val();
		// 公寓
		var apar = $("#seleApar").val();
		// 宿舍
		var dorm = $("#seleDorm").val();
		// 验证是否都被选择
		if (coll != '' && clas != ''
				&& grad != '' && sex != ''
				&& apar != '' && dorm != '') {
			$.ajax({
				url : "/gradPro/stud/addStud.action",
				data : {
					"studName":$("#studentName").val(),
					"studNo":$("#studentNo").val(),
					"collName":coll,
					"clasName":clas,
					"grade":grad,
					"sex":sex,
					"aparName":apar,
					"dormName":dorm},
				success : function(data) {
					//添加学生成功
					if ("1" == data.status) {
						// 成功后延时两秒跳转并提示信息
						countDown(2, data.message);
					} else if ("0" == data.status) {
						// 提示错误信息
						$("#alterTip").text(data.message);
						$("#alterTips").modal('show');
					}
				}
			})
		}// 如果存在未被选择
		else {
			// 提示并禁用按钮
			$("#subTips").hide().html("<label class='label label-danger'>请全部勾选选项</label>").show(500);
			//刷新页面
			setTimeout("location.reload()", 2000);
		}
	})					
}
);

对应后台Controller层方法如下:(这不是重点,请看到Service层返回再看)

	/**
	 * 新增学生
	 * @param studName
	 * @param studNo
	 * @param collName
	 * @param clasName
	 * @param grade
	 * @param sex
	 * @param aparName
	 * @param dormName
	 * @return
	 */
	@SuppressWarnings("finally")
	@RequestMapping("addStud.action")
	@ResponseBody
	public DataSet addStud(@RequestParam("studName") String studName, @RequestParam("studNo") String studNo,
			@RequestParam("collName") String collName, @RequestParam("clasName") String clasName, @RequestParam("grade") String grade,
			@RequestParam("sex") String sex, @RequestParam("aparName") String aparName, @RequestParam("dormName") String dormName) {
		DataSet data = new DataSet();
		try{
			//尝试添加学生
			studentService.addStud(studName,studNo,collName,clasName,grade,sex,aparName,dormName);
			data.setStatus("1");
			data.setMessage("添加学生成功");
		}//如果捕获到宿舍已经住满
		catch(DormHasAlaredyFullException e){
			data.setStatus(e.getErrorCode());
			data.setMessage(e.getErrorMSG());
		}finally{
			return data;
		}
	}

Service层的方法:如下图所示,先声明了一个事务@Transactional 配置代表这是一个Spring事务

如果查出宿舍总床位和入住人数已经相等,代表宿舍已住满,则这时抛出一个自定义宿舍已住满异常,事务结束。

否则继续下面逻辑,之前博客中也是应该如此处理。在返回controller层中捕获此异常,跟ajax请求做交互处理提示给用户。

	@Transactional
	@Override
	public int addStud(String studName, String studNo, String collName, String clasName, String grade, String sex,
			String aparName, String dormName) {
		//学生信息添加成功flag默认未成功
		int flag = 0;
		// 拿到学院Id
		String colleaId = colleageDao.getCollIdByName(collName);
		// 拿到班级Id
		String clasId = classesDao.getClassIdByClassName(clasName);
		// 拿到dormId
		String dormId = dormitoryDao.getDormIdByDormName(dormName);
		// 先在宿舍中更新信息
		// 查询除宿舍总人数和已住人数
		DormitoryPageDto tempDto = dormitoryDao.selectTotalBedAndHave(dormId);
		// 如果公寓已经住满了
		if (tempDto.getHaveEver() == tempDto.getTotalBed()) {
			// 抛出公寓已经住满了异常
			DormHasAlaredyFullException de = new DormHasAlaredyFullException("0", "宿舍"+dormName+"已经住满了");
			throw de;
		} // 如果宿舍未住满
		else {
			// 如果宿舍只剩一张床铺
			if ((tempDto.getHaveEver() + 1) == tempDto.getTotalBed()) {
				// 住进学生后修改宿舍状态
				Dormitory dormitory = new Dormitory();
				dormitory.setDormitoryId(Integer.parseInt(dormId));
				dormitory.setStatus("1");
				dormitoryDao.alterStatus(dormitory);
			}
			// 添加学生信息
			Student student = new Student();
			student.setStudentName(studName);
			student.setStudentNo(studNo);
			student.setColleageId(Integer.parseInt(colleaId));
			student.setClassId(Integer.parseInt(clasId));
			student.setGrade(grade);
			student.setSex(sex);
			student.setDormitoryId(Integer.parseInt(dormId));
			student.setStatus("1");
			flag = studentDao.addStud(student);
		}
		return flag;
	}

自定义异常类很简单:

/**
 * 添加学生时宿舍已住满异常
 * @author BreakingBad_
 *
 */
public class DormHasAlaredyFullException extends RuntimeException {
	private static final long serialVersionUID = 1L;

	private String errorCode;

	private String errorMSG;

	public DormHasAlaredyFullException(String errorMSG) {
		super(errorMSG);
	}

	public DormHasAlaredyFullException(String code, String message) {
		this.setErrorCode(code);
		this.setErrorMSG(message);
	}

	public String getErrorCode() {
		return errorCode;
	}

	public void setErrorCode(String errorCode) {
		this.errorCode = errorCode;
	}

	public String getErrorMSG() {
		return errorMSG;
	}

	public void setErrorMSG(String errorMSG) {
		this.errorMSG = errorMSG;
	}

测试:


表中宿舍名为702-4的总床位为6,对应的学生外键指向该宿舍的人数也为6

此时尝试向该宿舍添加学生:


成功。

猜你喜欢

转载自blog.csdn.net/weixin_41809916/article/details/79867736