gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:16:28 25 4
gpt4 key购买 nike

我有 3 张 table :

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

以及以下两个 Hibernate 实体:

用户:

@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 的关系是多对一的,因此一个角色只能有一个用户。

关于java - 在 hibernate 中删除用户实体时,角色也会被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com