复制具有关联角色的新用户

时间:2018-03-15 11:55:49

标签: java spring hibernate jpa

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

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

有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:2)

有很多事情可能出错:

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

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

答案 1 :(得分:1)

在JPA Find方法中,还会刷新数据。在您使用user方法检索find时,它已移至托管状态。

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

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