SSJ更新數據產生的數據丟失問題
文章目錄
1. 問題描述
1.1 問題解釋
當前端修改datagrid的某一條數據的時候,在表單中的數據並不是完全對應着數據庫的一條完整的數據,一般表單中只包含數據庫一條記錄的部分字段,當請求攜帶着參數到達後臺的修改方法後,後端直接調用修改方法就會將數據庫中在前臺表單中不存在的字段的值置爲空,這就是更新數據產生的數據丟失問題。
1.2 圖形描述
2. 三種解決方案
2.1 在前端解決
- 解決方案:隱藏要傳遞的值(只隱藏,但是數據還是需要傳遞)。
- 缺點:如果字段過多,代碼量會比較大,安全性低。
2.2 在JPA相應的字段上加註解
@Column(updatable = false)
private String password;
2.3 先查詢,再修改
- 解決方案:先查詢數據庫,獲取持久狀態的對象,然後把頁面的數據set到對象裏面。
Employee tempEmployee = employeeService.get(employee.getId());
//需要修改的值就從頁面裏面的employee放入tempEmployee
tempEmployee.setUsername(employee.getUsername());
employeeService.save(tempEmployee);
3. SpringMVC之@ModelAttribute
@ModelAttribute的作用
- @ModelAttribute如果運用在方法上,會在每一個@RequestMapping標註的方法前執行,如果有返回值,則自動將該返回值加入到ModelMap中。
- @ModelAttribute如果運用在參數上,會將客戶端傳遞過來的參數按名稱注入到指定對象中,並且會將這個對象自動加入ModelMap中,便於View層使用。
/**
* 當在進行修改的時候,修改員工的時候會產生數據丟失現象
* 然後將註解部分連同參數一起作爲修飾參數的save方法
* @param employee
* @return
*/
@RequestMapping("/update")
@ResponseBody
public JsonResult update(@ModelAttribute("editEmployee") Employee employee) {
try {
employeeService.save(employee);
return new JsonResult();
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(false, e.getMessage());
}
}
- 添加一個方法(這個時候修改部門會報n-to-n錯誤,以下方法中添加了解決方案)
/**
* 設計這個方法是爲了解決在修改員工的時候會產生數據丟失的問題。
* springmvc的@ModelAttribute註解會在每個controller的每個方法前面執行
* @param id
* @param cmd 因爲這個方法在每個被@RequestMapping修飾方法執行前都要執行,所以對性能影響較大,這個方法應該只在執行update方法的時候執行,所以前臺在設計發送請求的時候定義一個cmd標誌,如果cmd的標誌爲“_update”的時候,就執行這個方法,否則直接返回null,結束本方法。
* @return
**/
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id, String cmd) {
if (id != null && "_update".equals(cmd)) {
Employee employee = employeeService.findOne(id);
/**
* 這個方法的設計是爲了解決當前臺修改部門的時候,調教修改的時候會報錯:n to n
* 這個錯誤的原因是:當修改部門的時候,實際上是修改的employee對應的持久化對象的department持久化對象的oid
* 解決辦法就是:直接將員工關聯的department對象設置爲null
* 然後springmvc會根據前臺的department.id自動創建一個非持久的department對象
*/
employee.setDepartment(null);
return employee;
}
return null;
}