如何仅更新已更改的属性 - Spring MVC

时间:2016-02-12 07:44:15

标签: java spring model-view-controller

我的控制器

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
public String updateUserById(@PathVariable("id") Long id, Model model) {
    User user = userRepository.findOne(id);
    model.addAttribute(user);
    return "admin/editUser";
}

@RequestMapping(value = "/user/{id}", method = RequestMethod.POST)
@ResponseBody
public String updateUserById(@PathVariable("id") Long id, @ModelAttribute User user) {
    userRepository.updateUser(id, user); // with a try catch
}

道歉

@Override
public void updateUser(Long id, User user) {
    User userDB = userRepository.findOne(id);
    userDB.setFirstName(user.getFirstName());
    userDB.setLastName(user.getLastName());
    userDB.setEmail(user.getEmail());
    userDB.setUsername(user.getUsername());
    userRepository.save(userDB);
}

这种方法有效,但对我来说非常难看。让我们说用户刚刚更改了视图中的firstname字段,如何调整我的代码只调用函数来设置名字?

类似于通知字段的Observer模式有哪些变化?

2 个答案:

答案 0 :(得分:3)

如果你正在使用hibernate,那么hibernate dynamicUpdate = true中有一个属性只会更新db中的更新字段

如下面的代码

@Entity
@Table(name = "User")
@org.hibernate.annotations.Entity(
        dynamicUpdate = true
)
public class User 

for hibenrate 4 +使用这些

@DynamicInsert(true)
@DynamicUpdate(true)

答案 1 :(得分:1)

我认为你的代码是这样的:

用户想要更改其user entity的某些数据。在前端的方法你已经从数据库的用户表中显示了他的所有条目,如firstname,lastname等。

例如,用户更改了他的名字并点击了保存按钮。您的控制器会收到用户实体,包括user.id,新名字和所有旧设置值。如果您的代码像这样工作,您可以轻松save()用户实体。无需先从数据库中获取用户。

所以就这样做:

@Override
public void updateUser(User user) {
    userRepository.save(user);
}

Repository知道用户实体的Id,只更新完整的实体。

由于您在用户实体中没有Id的原因,请使用控制器中的ID,如下所示:

@Override
public void updateUser(User user, Long Id) {
    user.setId(Id);
    userRepository.save(user);
}