我想要做的是获取数据用户并复制到新用户(创建新用户)。这就是我正在做的事情:
@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);
有什么建议吗? 感谢
答案 0 :(得分:2)
有很多事情可能出错:
就个人而言,我建议使用@ManyToMany,这应该可以解决问题
答案 1 :(得分:1)
在JPA Find
方法中,还会刷新数据。在您使用user
方法检索find
时,它已移至托管状态。
然后您从user
对象获取角色集合并将其分配给newUser
。现在基本上你有两个实体具有相同的集合引用,这是不允许的。
您可以在保存user
之前从持久性上下文中分离newUser
,或者在将角色集合添加到newUser
之前克隆它。