【问题标题】:How to Update user info using spring data jpa如何使用 spring data jpa 更新用户信息
【发布时间】:2020-01-10 15:15:34
【问题描述】:

用户实体

@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;
        }

我怎样才能使这个编辑控制器方法起作用?甚至可以更改实体的 ID 吗?我有一个 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) 进行操作,但每当我编辑电子邮件时,它都会创建新用户,并且每当我更改密码时,我都无法再使用任何密码登录。

【问题讨论】:

标签: spring spring-data-jpa


【解决方案1】:

您必须传递数据库中存在的电子邮件 ID。如果您 userRepository.save(user) 使用有效的电子邮件,那么它应该更新用户信息。

第二种方法是您可以使用以下用户更新方法

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

【讨论】:

    【解决方案2】:

    首先,如果您想更新现有实体,您必须公开 PUTPATCH API,具体取决于您要提供的更新类型(它在你的情况下看起来像 PATCH)。

    如果您只需要更新实体中的几个字段,您可以遵循 Jaganath 的回答。否则,请read this answer,它将为您提供更灵活的更新方式。

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 2017-10-23
      • 2016-12-10
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多