Как обновить информацию о пользователе, используя данные весны jpa - PullRequest
0 голосов
/ 09 января 2020

User Entity

@Entity
    public class User {
        @Id
        @Email
        @NotEmpty
        @Column(unique = true)
        private String email;
        @NotEmpty
        private String name;
        @Size(min=4)
        private String password;
        @OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
        private List<Task> tasks;
        @ManyToMany(cascade = CascadeType.ALL)
        @JoinTable(name="USER_ROLES",joinColumns = {
                @JoinColumn(name="USER_EMAIL",referencedColumnName = "email")
        },inverseJoinColumns = {@JoinColumn(name="ROLE_NAME",referencedColumnName = "name")})
        private List<Role> roles;

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public List<Task> getTasks() {
            return tasks;
        }

        public void setTasks(List<Task> tasks) {
            this.tasks = tasks;
        }

        public List<Role> getRoles() {
            return roles;
        }

        public void setRoles(List<Role> roles) {
            this.roles = roles;
        }

Как я могу заставить работать этот метод контроллера редактирования? Можно ли вообще изменить идентификатор сущности? У меня есть форма HTML, и я хочу обновить электронную почту и пароль через нее.

@GetMapping(value = "/admin/setDetails")
public String editUser(@RequestParam("email") String email, Model model){
    User user = userService.findOne(email);
    model.addAttribute("user",user);
    return "setdetails";
}

Я также пытался сделать это с помощью userRepository.save(user), но всякий раз, когда я редактировал электронную почту, это создает нового пользователя, и всякий раз, когда я менял пароль, я не мог больше входить в систему с любым паролем.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Прежде всего, если вы хотите обновить существующую сущность, вы должны предоставить API PUT или PATCH в зависимости от того, какой тип обновления вы хотите предоставить (похоже, ПАТЧ в вашем случае).

Вы можете следовать ответу Джаганатхи в случае, если вам нужно обновить только несколько полей в вашей сущности. В противном случае, пожалуйста, прочитайте этот ответ , это даст вам более гибкий способ обновления.

0 голосов
/ 10 января 2020

Вы должны передать идентификатор электронной почты, который присутствует в БД. Если вы userRepository.save (пользователь) с действительным адресом электронной почты, то он должен обновить информацию о пользователе.

Второй подход заключается в том, что вы можете обновить метод пользователя, как показано ниже

    @Modifying
    @Transactional
    @Query("update User u set u.password = :#{#user.password} where u.email = :#{#user.email}")
    int updateInfo(@Param("user") User user);
...