我有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}
。确定您需要哪些并删除其他方法。
我不明白的一件事。您说角色被删除"即使其他用户仍然与该角色有关"。这是不可能的。
Role
和 User
的关系是多对一的,因此角色只有一个用户。