gpt4 book ai didi

java - Spring(Hibernate)更新问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:14 26 4
gpt4 key购买 nike

我在 Spring(或 Hibernate)中遇到更新之前检查数据库中数据是否存在的问题。我想更新用户的个人资料,并且可以更改名称、密码和电子邮件字段。名称和密码不必是唯一的,但电子邮件必须是唯一的。我显示的表单中包含由用户旧数据填充的字段,当我输入新数据而不更改通过电子邮件发送时,当然,显示它已经存在。如果删除此检查,我将在基地中有两封相同的电子邮件。如何为特定用户设置相同的数据?

我通过检查电子邮件进行更新的方法。

public void updateUser(User user) throws NotUniqueEmailException {
if (user == null) {
throw new NullPointerException();
}
if (user.getUserId() < 1) {
throw new IllegalArgumentException();
}
if (user.getEmail() == null || user.getEmail().intern().equals("")) {
throw new IllegalArgumentException();
}
if (getUserByEmail(user.getEmail()).getEmail() != null) {
throw new NotUniqueEmailException("The email of user not unique! " + user.getEmail());
}
currentSession().update(user);
// currentSession().saveOrUpdate(user);

}

我还有另一种方法来检查是否存在。

public boolean isEmailExists(User user) {
Session session = HibernateUtil.openSession();
boolean result = true;
Query query = session.createQuery("SELECT u FROM User u WHERE u.email=?");
query.setString(0, user.getEmail());
User u = (User) query.uniqueResult();
if (u == null) {
result = false;
}
return result;
}

更新 Controller

@RequestMapping(value = "/edit/{userId}", method = RequestMethod.GET)
public String updateView(@PathVariable("userId")Integer userId,
UserForm userForm,
HttpSession session,
ModelMap model){
User user=userService.getUserById(userId);
userForm.setUser(user);
model.addAttribute("userForm",userForm);
return"profileupdate";
}


@RequestMapping(value = "/edit.do/{userId}", method = RequestMethod.POST)
public String updateUserProcess(@ModelAttribute(value = "userForm")
UserForm userForm,
@PathVariable("userId")Integer userId,
BindingResult result,Model model,
HttpSession session,
HttpServletRequest request){
User user=userService.getUserById(userId);
session.getAttribute("userForm");
model.addAttribute("userForm",userForm);
updateValidator.validate(userForm,result);

if(result.hasErrors()){
logger.error("Validation error");
return"profileupdate";
}

return updatingUser(userForm,user,model,request);


}

private void fillForm(UserForm userForm,User user){
userForm.setUserId(user.getUserId());
userForm.setLogin(user.getLogin());
userForm.setRegDate(user.getRegDate());
userForm.setComputers(userService.getAllUsersComputers(user.getLogin()));
userForm.setRole(roleService.findByName(user.getRole().getRoleName()));
}


private String updatingUser(UserForm userForm,User user,Model model,HttpServletRequest request){

fillForm(userForm,user);
user=userForm.getUser();
try{
userService.updateUser(user);
logger.info("User updated!");
request.getSession().setAttribute("user",user);
return"newprofile";
}catch(NotUniqueEmailException e){
logger.error("Can't update user - not unique email!!",e);
model.addAttribute("errorMsg","Email is already in use!");
return"profileupdate";
}
}

最佳答案

编辑:为 Hibernate 持久性方法添加元素

如果您希望 Hibernate 自动知道它应该执行更新而不是插入,则必须在 user 中设置主键。正如您所说的字段已被修改,我想 user 字段来自表单输入。您有两种方法来保留 id:

  • 将其存储在表单中的隐藏输入字段中 - 提交时,spring 将填充它
  • 将其放在路径变量中,将其放入 Controller 中并自行填充 (@RequestMapping(/.../{id}) public String method(@PathVariable("id") user_id, ...))

但这可能还不够,您可能会遇到 mergeupdatesaveOrUpdate 问题。 SO 的另一篇文章可以给出指示 Hibernate : Downside of merge over update

关于java - Spring(Hibernate)更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24388702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com