我的模特是
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name="name")
private String name;
@Column(name="email")
private String email;
//getter & setter
}
我的控制器是
@RequestMapping(value = "user/userProfile", method = RequestMethod.POST)
public String saveUserProfile(@Valid UserProfile userProfile, @RequestParam("file") MultipartFile file,
BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
model.addAttribute("userProfile", userProfile);
return "userprofileform";
}
userProfileService.saveUserProfile(userProfile);
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:/user/home";
}
@RequestMapping("/user/userProfile/new")
public String newUserProfile(Model model) {
UserProfile profile = userProfileService.getUserProfileByUserId(userService.getLoggedInUser().getId());
model.addAttribute("userProfile", profile);
return "userprofile";
}
存储库是
@Transactional
public interface UserProfileRepository extends CrudRepository<UserProfile, Long>{
}
当我第一次创建userProfile时,它会成功创建,但是当我尝试更新它时,它会创建新条目。
但是在这个控制器中,当我使用findone()并复制所有信息时,它工作正常。
下面替换了相同的保存方法,如:
public String saveUserProfile(@Valid UserProfile userProfile, @RequestParam("file") MultipartFile file,
BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
model.addAttribute("userProfile", userProfile);
return "userprofileform";
}
UserProfile tempProfile = userProfileService.getUserProfileByUserId(userService.getLoggedInUser().getId());
try {
if (tempProfile != null) {
tempProfile.setName(userProfile.getName());
tempProfile.setEmail(userProfile.getEmail()); userProfileService.saveUserProfile(tempProfile);
} else {
userProfile.setUserId(userService.getLoggedInUser().getId());
userProfileService.saveUserProfile(userProfile);
}
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:/user/home";
}
这是写方式还是我们如何更新记录?。
或保存会话属性(@SessionAttributes(&#34; yourAttributeName&#34;))只是写方式?
答案 0 :(得分:0)
确保userProfile对象已分配id。如果你的对象没有id,那么hibernate认为它是一个新实体,因此它会在数据库中创建一条新记录。
答案 1 :(得分:0)
您需要确认当您要进行更新时,UserProfile具有ID。将调试点放在:profileRepo.save(userProfile)以确认这一点,因为如果不存在id,将创建新实体,并且如果id已存在则应更新。