【问题标题】:Copy new user with associated roles复制具有关联角色的新用户
【发布时间】:2018-03-15 11:55:49
【问题描述】:

我想要做的是获取数据用户并复制到新用户(创建一个新用户)。这就是我正在做的:

@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")
    private int roleId;

    @Column(name = "role")
    private String role;

    public Role() {
    }
}


@Entity
@Table(name = "usuario")
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;


    @Column(name = "email")
    private String email;

    @Column(name = "password", nullable=false, length=60)
    private String password;

    @Column(name = "name", unique=true, nullable=false, length=6)
    private String name;


    @Column(name = "last_name")
    private String lastName;

    @Column(name = "active", nullable=false)
    private int active;


    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    public Users() {
    }

}

我从一位现有用户那里获取数据:

Optional<Users> user = usersRepository.findByName(name);

//create a new User to persist
Users newUser = new Users();
newUser.setName("new name");
newUser.setActive(1);
newUser.setEmail(user.get().getEmail());
newUser.setLastName(user.get().getLastName());
newUser.setPassword(user.get().getPassword());
Set<Role> roles = user.get().getRoles();

newUser.setRoles(roles);
usersRepository.save(newUser);  

我收到这条消息:

找到对集合的共享引用:model.authentication.Users.roles; 嵌套异常是 org.hibernate.HibernateException:找到对集合的共享引用:model.authentication.Users.roles

更新 1(已解决)

        Optional<Users> user = usersRepository.findByName(codalojamiento);
        Users newUser = new Users();
        newUser.setName("new name");
        newUser.setActive(1);
        newUser.setEmail(user.get().getEmail());
        newUser.setLastName(user.get().getLastName());
        newUser.setPassword(user.get().getPassword());
        Set<Role> newRoles = new HashSet();
        Set<Role> roles = user.get().getRoles();
        for (Role r : roles) {
            newRoles.add(r);
        }
        newUser.setRoles(newRoles);
        usersRepository.save(newUser);

有什么建议吗? 谢谢

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    有很多事情可能出错:

    • 由于您将一个用户链接到多个角色,但同时多个用户可以拥有相同的角色,关系应该是@ManyToMany,而不是@OneToMany。
    • 其次,如果您坚持使用 @OneToMany 关系,则您将新用户链接到现有用户的角色,因此解决方案可能是为该用户创建与第一个角色相同的新角色用户

    就个人而言,我建议使用@ManyToMany,这应该可以解决问题

    【讨论】:

      【解决方案2】:

      在 JPA 中 Find 方法也会刷新数据。在这里,当您使用 find 方法检索到 user 时,它会转移到托管状态。

      然后您从user 对象中获取角色集合并将其分配给newUser。现在基本上你有两个实体有相同的集合引用,这是不允许的。

      您可以在保存newUser 之前从持久性上下文中分离user,或者在将角色集合添加到newUser 之前克隆角色集合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 2015-05-23
        • 2014-07-16
        • 2017-12-01
        相关资源
        最近更新 更多