【发布时间】: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