修改数据数据丢失和N to N错误的解决方式

数据丢失

当我们修改某一行数据的时候,原本这一列有值的,修改成功后,发现这列的值不见了,这就是数据丢失!
解决方案:
使用隐藏的文本框可以解决:

<input type="hidden" name="headImage" />

使用SpringMVC的@ModelAttribute注解来解决
上面第一种解决方案其实很简单,但是我们今后的domain实体类的字段其实会有更多的字段,或者甚
至还有些字段么没有展示到那个表格中,所以这个隐藏文本框可能会写很多个,感觉不够高大上。

/**
     * @ModelAttribute 注解写在这个方法上面,表示当前类的其他所有方法执行之前都要先去执行一次本方法
     * 类似于单元测试的 @Bofore 注解的作用
     * 但是我们只想在update方法执行之前来执行一次这个方法,去查询一个对象出来
     * @param id
     * @return
     */
    @ModelAttribute("update")
    public Employee findOneBeforeUpdate(String action, Long id){
        Employee employee = null;
        //只有修改数据的时候才去执行查询
        if("update".equals(action)) {
            employee = employeeService.findOne(id);//持久状态对象
            //解决 N to N 错误
            //employee.setDepartment(null);
        }
        return employee;
    }
    /**
     * @ModelAttribute("update") 放在update方法的形参变量之前,表示将上面那个注解的方法返回的对象(持久状态)
     * 与前端表单提交过来的对象(临时状态)属性值进行合并后,再传入到update方法中
     * 合并:将临时状态的对象的非空属性值赋值给持久状态对象对应的属性,以这个持久状态对象为准
     * @param employee
     * @return
     */
    @ResponseBody
    @RequestMapping("/update")
    public Result update(@ModelAttribute("update")Employee employee){
        try {
            //设置一下密码,密码默认与用户名一致
            employee.setPassword(employee.getUsername());
            employeeService.update(employee);
            return new Result(200, "修改成功!");
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(500, "修改失败:" + e.getMessage());
        }
    }

前端提交表单的js加了一行代码

if(params.id){
	 url = "/employee/update";
	 params.action = "update"; 
 }

N to N错误

当修改数据时,去修改员工所属的部门时会出现N to N错误:
原因:是因为我们刚才添加了 @ModelAttribute注解后,传入到update方法中的对象实际上是一个持久状态的Employee对象,而一个持久状态对象关联的对象也一定是持久状态(Department对象也是持久状态的),而JPA规定持久状态对象的主键不允许修改,一旦被修改就会报N to N错误!!!
解决方案:将员工所属的部门对象从持久状态改为临时状态
具体做法:将@ModelAttribute注解的方法中查询到的那个Employee对象与所属部门对象断开关系

//解决 N to N 错误
 employee.setDepartment(null);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值