2014-06-24 4 views
1

DB에 데이터 존재 여부를 확인하고 업데이트 할 때까지 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; 
    } 

는 업데이트 컨트롤러는

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

사용자의 기본 키는 무엇입니까? –

+0

전자 메일 사용자가 이미있는 경우 레코드를 업데이트 할 수 있습니다. –

+0

@ Serge Ballesta PK는 사용자의 ID입니다. – Devour

답변

-1

는 인수 u.getId()

2

편집과 user.getId()를 비교 : Hibernate 영속 방법에 대한 요소를 추가

당신이 만약 Hibernate가 업데이트가 아니라 삽입을해야한다는 것을 자동적으로 알고 싶다면, 기본 키 user으로 설정해야합니다. 필드가 수정되었다고 가정하면, user 필드가 양식 입력에서 왔다고 가정합니다. 당신은 ID를 유지하는 두 가지 방법이 있습니다 양식에 숨겨진 입력 필드에

  • 가게를 - 제출에를, 봄 컨트롤러에 그것을 얻을,
  • 는 경로 변수에이를 채우고 웁니다 스스로 ( @RequestMapping(/.../{id}) public String method(@PathVariable("id") user_id, ...))

하지만 충분하지 않을 수 있습니다 당신은 mergesaveOrUpdateupdate 대 문제가있을 수 있습니다. 이렇게 다른 게시물에서 표시를 줄 수 있습니다 Hibernate : Downside of merge over update

+0

ID를 통해 업데이트하는 컨트롤러를 완료했습니다. 하지만 여전히 도움이되지 않습니다. 그것은 상단에 게시됩니다. – Devour