【问题标题】:Spring (Hibernate) updating issueSpring(Hibernate)更新问题
【发布时间】:2014-08-14 20:06:28
【问题描述】:

我在 Spring(或 Hibernate)中遇到问题,需要检查 DB 中的数据是否存在直到更新。我想更新用户的个人资料,我可以更改姓名、密码和电子邮件字段。名称和密码不必是唯一的,但电子邮件必须是唯一的。我用用户的旧数据填充的字段显示表单,当我输入新数据而不更改电子邮件时,当然表明它已经存在。如果删除此检查,我将在 base 中有两封相同的电子邮件。如何为某些用户设置相同的数据?

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

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;
    }

更新控制器

@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";
        }
    }

【问题讨论】:

  • 用户的主键是什么?
  • 如果用户的邮箱已经存在,您可以更新记录
  • @Serge Ballesta PK 是用户 ID。
  • @pratim_b 是的,如果我删除检查,我可以更新记录。但是如果我删除检查任何用户都可以设置相同的电子邮件。
  • 在这种情况下您是更新记录还是插入新记录?

标签: java spring hibernate email spring-mvc


【解决方案1】:

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

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

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

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

【讨论】:

  • 我已经通过 id 完成了控制器的更新。但这仍然无济于事。它张贴在顶部。
【解决方案2】:

比较参数 user.getId() 和 u.getId()

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2017-06-14
    相关资源
    最近更新 更多