我的控制器
@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模式有哪些变化?
答案 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);
}