如何在springboot JpaRepository中更新记录?

时间:2016-02-01 13:10:22

标签: spring spring-mvc spring-boot spring-data-jpa

我的模特是

@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;))只是写方式?

2 个答案:

答案 0 :(得分:0)

确保userProfile对象已分配id。如果你的对象没有id,那么hibernate认为它是一个新实体,因此它会在数据库中创建一条新记录。

答案 1 :(得分:0)

您需要确认当您要进行更新时,UserProfile具有ID。将调试点放在:profileRepo.save(userProfile)以确认这一点,因为如果不存在id,将创建新实体,并且如果id已存在则应更新。