Java 在hibernate中删除用户实体时,角色也会被删除

Java 在hibernate中删除用户实体时,角色也会被删除,java,hibernate,Java,Hibernate,我有三张桌子: user: (id,username,password) role: (id,role) user_roles: (user_id, role_id) 以及以下两个Hibernate实体: 用户: 当我现在删除一个用户时,相应的角色也会从“角色”表中删除,而只是删除用户行和用户角色关系。即使其他用户仍然与该角色相关。我使用以下命令删除该用户 @Transactional public void deleteByName(String userName) { User u

我有三张桌子:

user: (id,username,password)
role: (id,role)
user_roles: (user_id, role_id)
以及以下两个Hibernate实体:

用户:

当我现在删除一个用户时,相应的角色也会从“角色”表中删除,而只是删除用户行和用户角色关系。即使其他用户仍然与该角色相关。我使用以下命令删除该用户

@Transactional
public void deleteByName(String userName) {
    User user = this.getByName(userName);
    Session session = sessionFactory.getCurrentSession();
    session.delete(user);
}
有人知道为什么以及如何解决这个问题吗


谢谢

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

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER )
private Set<Role> roles = new HashSet<Role>();
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
私有集角色=新HashSet();
如果您不希望在删除用户时删除角色,则必须缩小级联设置的范围。现在您正在使用
ALL
。这相当于
{PERSIST、REMOVE、REFRESH、MERGE、DETACH}
。决定你需要哪一个,然后去掉其他的

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


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

确保数据库中不存在删除cacade,我只是假设没有,因为级联的行为配置是冗余的。如果移除级联已经消失,但是级联移除仍然发生,我会查看DB。谢谢你的回答,我只是注意到我的问题是一对一的关系。创建用户时,我使用的角色基本相同。例如,user1和user2的“用户角色”。我可能需要很多种关系。是吗?不客气:)多对多关系更适合用户及其角色。但是,请注意层叠设置。到目前为止,在将OneToMany替换为ManyToMany并删除层叠设置时,用户行将被删除,用户角色行将被删除,而不是角色行。它起作用了。现在也可以创建用户并将其与角色关联。谢谢
@Transactional
public void deleteByName(String userName) {
    User user = this.getByName(userName);
    Session session = sessionFactory.getCurrentSession();
    session.delete(user);
}
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER )
private Set<Role> roles = new HashSet<Role>();