博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决数据丢失问题
阅读量:5750 次
发布时间:2019-06-18

本文共 2932 字,大约阅读时间需要 9 分钟。

  1. 数据丢失问题

这里我们出现一个新的问题,当我们完成修改之后,咱们的密码就消失不见了,这里咱们有三个解决方案(至少为什么修改后密码会消失不见,请大家自己分析「第一个项目中已经讲解过原因」!

 

1.1. 三种解决方案

在这里,咱们有三个解决方案:

方案一:隐藏要传递的值(只隐藏,但是数据还是需要传递,这和第一个项目是同相同的方案)

这个方案的优点是简单易理解,缺点是如果字段过多,代码量会比较大,另外这种方案的安全性确实是有一些低!

方案二:在JPA的相应字段上加标签:

@Column(updatable = false)

private String password;

这个方案也比较简单,但是如果你需要修改这个字段的时候就比较麻烦!

 

方案三:先查询数据库,获取持久状态的对象,然后把页面的数据set到对象里面

(这种方案也是用得比较多的一种方案)

Employee tempEmployee = employeeService.get(employee.getId());

//需要修改的值就从页面里面的employee放入tempEmployee

tempEmployee.setUsername(employee.getUsername());

employeeService.save(tempEmployee);

 

 

1.2. SpringMVC@ModelAttribute

咱们如果自己要完成所有数据查询,再进行相应的字段拷备覆盖,还是比较麻烦的。大家如果反射与JavaBean部分学得比较透彻的话可以去进行相应的尝试(主要就是完成一个属性拷备功能)

  而在SpringMVC中,有一个ModelAttribute标签,可以助我们完成这个功能!

  接下来,我们就来学习一下这个标签的作用!!!

 

1.2.1. ModelAttribute的作用

运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;

运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;

 

咱们先不管返回值,我们在EmployeeController类中加一个相应的方法,看是否要执行所有代码之前都会先执行这个方法!!!

@ModelAttribute

public void beforeEdit(){

    System.out.println("执行就执行,我不怕的!!!");

}

 

1.2.2. 传参与解决方案

这时候,我们可以看到这个类所有的方法(通过路@RequestMapping)访问之前都会先访问这个方法。接下来,我们可以看一下这个是怎么传值的。

在下面的传值代码中我们也解决了数据丢失的问题。

//这里准备一个方法,所有方法执行前都会执行它

@ModelAttribute("editEmployee")

public Employee beforeEdit(Long id){

    if(id!=null){

        Employee employee = employeeService.findOne(id);

        return employee;

    }

    return  null;

}

 

@RequestMapping("/save")

@ResponseBody

public Map<String,Object> save(Employee employee){

    return saveOrUpdate(employee);

}

 

@RequestMapping("/update")

@ResponseBody

public Map<String,Object> update(@ModelAttribute("editEmployee")Employee employee){

    return saveOrUpdate(employee);

 

}

 

 

1.2.3. 只让修改功能去查询

大家思考一下,咱们的现在所有方法都会进入到beforeEdit中,那么只要传过来id,就会执行这个方法,这个对效率是会有影响的。所以我们可以对代码进行修改,让只有修改功能才去执行这个查询代码!!

employee.js -> 修改时传一个cmd=update

var itsource={

    

    //保存数据

    save:function () {
        var url  = "/employee/save";
        var id = $("#employeeId").val();
        if(id){
            url = "/employee/update?cmd=update";
        }
        employeeForm.form('submit', {
            url:url,
            onSubmit: function(){
                //做验证
                return $("#employeeForm").form("validate");
            },
            success:function(data){
                $('#employeeGrid').datagrid('reload');
                employeeDialog.dialog('close');
            }
        })
    }
}

 

EmployeeController进行判断

/**

 * 特性:在执行相应方法之前都会先执行这个方法
 */
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id, String cmd){
    //id的时候-> 修改功能
    if(id!=null && "update".equals(cmd)) {
        Employee employee = employeeService.findOne(id);
        return employee;
    }
    return null;
}

 

1.2.4. 部门修改的n-to-n

这时候大家继续开发会发现一个问题,在修改部门的时候,会出现n-to-n错误,就是咱们修改的时候也在相应的修改它的部门(这时候部门是一个持久化对象,它的id是不允许进行修改的。)

 报错如下:

 

 

解决方案(在获到员工的时候把部门设置为空)

/**

 * 特性:在执行相应方法之前都会先执行这个方法
 */
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id, String cmd){
    //id的时候-> 修改功能
    if(id!=null && "update".equals(cmd)) {
        Employee employee = employeeService.findOne(id);
        //把这个要修改的关联对象设置为null,可以解决n-to-n的问题
        employee.setDepartment(null);
        return employee;
    }
    return null;
}

 

转载于:https://www.cnblogs.com/yh9264426/p/10622856.html

你可能感兴趣的文章
上云就是这么简单——阿里云10分钟快速入门
查看>>
MFC多线程的创建,包括工作线程和用户界面线程
查看>>
我的友情链接
查看>>
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
Spring IoC容器初的初始化过程
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
关于完成生鲜电商项目后的一点总结
查看>>
noip2012 普及组
查看>>
第二阶段 铁大Facebook——十天冲刺(10)
查看>>
Java判断是否为垃圾_Java GC如何判断对象是否为垃圾
查看>>
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
java数组只能交换0下标和n_编程练习-只用0交换排序数组
查看>>
centos7安装mysql视频教程_centos7安装mysql(完整)
查看>>
php图片赋值,php如何优雅地赋值
查看>>
【探索HTML5第二弹01】HTML5的前世今生以及来世
查看>>