在删除Hibernate中的用户实体时,角色也将被删除



我有3个表:

user: (id,username,password)
role: (id,role)
user_roles: (user_id, role_id)

以及以下两个休眠实体:

用户:

@Entity
@Table(name = "user")
public class User implements Serializable{
    @Id
    @GeneratedValue
    private Long id;
    private String userName;
    private String password;
    private boolean active = false;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER )
    @JoinTable(name = "user_roles", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "role_id", referencedColumnName = "id") })
    private Set<Role> roles = new HashSet<Role>();
....

角色:

@Entity
@Table (name = "roles")
public class Role implements Serializable {
@Id @GeneratedValue
private Long id;
private String role;
....

现在,当我删除用户时,相应的角色也会从"角色"表中删除,而不是仅删除用户行和user_roles关系。即使其他用户仍然与该角色有关。我用以下内容删除用户。

@Transactional
public void deleteByName(String userName) {
    User user = this.getByName(userName);
    Session session = sessionFactory.getCurrentSession();
    session.delete(user);
}

有人知道为什么以及如何解决这个问题?

谢谢

这是当前映射的预期行为。它由cascade设置配置:

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER )
private Set<Role> roles = new HashSet<Role>();

如果您不希望在用户时删除角色,则必须缩小级联设置的范围。现在您正在使用ALL。这相当于{PERSIST, REMOVE, REFRESH, MERGE, DETACH}。确定您需要哪些并删除其他方法。

我不明白的一件事。您说角色被删除"即使其他用户仍然与该角色有关"。这是不可能的。

RoleUser的关系是多对一的,因此角色只有一个用户。

最新更新