Hibernate:防止角色表中有多个相同的条目

Posted

技术标签:

【中文标题】Hibernate:防止角色表中有多个相同的条目【英文标题】:Hibernate: preventing multiple same entries in role table 【发布时间】:2016-12-12 06:01:13 【问题描述】:

每当我将用户及其角色保存到我的数据库时,它还会在我的角色表中添加一个额外的行。

每个用户有多个角色,每个角色可以属于多个用户)。

我的数据库中有 3 个表:

users(ID、用户名) roles_users (user_id, role_id) roles(ID、角色)

例如我的Role 表中有 2 个角色(ROLE_ADMINROLE_USER),我保存了一个角色为ROLE_ADMIN 的用户,我的roles_users 表已更新,但我的@987654329 中也创建了一个新行@table(我想防止这种情况发生)。

有几种方法可以防止这种情况发生:

    编写一个只更新我的userroles_users 表的查询 将role-id 设置为与role-name 相同的id(基本上是覆盖行,我现在正在这样做)

所以我的问题是,有没有更好的方法来使用 hibernate 来做到这一点?

这是我的User 模型:

@Entity(name = "users")
public class User

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "roles_users",
        joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
        uniqueConstraints = @UniqueConstraint(columnNames = "user_id", "role_id"))
private Set<Role> roles;

public Long getId() 
    return id;


public String getUsername() 
    return username;


public void setUsername(String username) 
    this.username = username;


public Set<Role> getRoles() 
    if (roles == null) 
        roles = new HashSet();
    
    return roles;


public void setRoles(Set<Role> roles) 
    this.roles = roles;


这是我的Role 模型:

@Entity(name = "roles")
public class Role 

@Id
//@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;

@ManyToMany(mappedBy = "roles", cascade = CascadeType.PERSIST)
private Set<User> users;

public Long getId() 
    return id;


public void setId(Long id) 
    this.id = id;


public String getName() 
    return name;


public void setName(String name) 
    this.name = name;


public Set<User> getUsers() 
    if (users == null) 
        users = new HashSet();
    
    return users;


public void setUsers(Set<User> users) 
    this.users = users;


这是我用来保存用户及其角色的代码:

    User user = new User();
    Role role = new Role();

    user.setUsername("john");
    role.setName("Admin");
    role.setId(Long.valueOf(1));
    role.getUsers().add(user);
    user.getRoles().add(role);

    userService.saveUser(user);

【问题讨论】:

【参考方案1】:

问题是您正在创建角色实例,然后将用户添加到该实例中,然后再次从该用户实例中添加相同的角色在最后一行,因此您有两个角色对象分配给该用户,这就是为什么要存储两个输入所以删除最后第二行代码再次添加角色对象并使用以下代码保存用户,它应该适合你-

User user = new User();
Role role = new Role();

user.setUsername("john");
role.setName("Admin");
role.setId(Long.valueOf(1));
role.getUsers().add(user);


userService.saveUser(user);

用角色的保存方法代替上面的尝试。

【讨论】:

为什么需要再次添加它,用户实体已经初始化,然后角色有用户集合,并且您通过以下 line-role.getUsers().add(user) 添加了它。然后这个用户实体与角色有双向关系,因此具有角色对象值,所以最后你只需要保存那个用户对象,因此我给你的代码是正确的! 我删除了我的评论(我说错了)。顺便说一句,不幸的是它不起作用,角色对象永远不会保存。 好的,np,您也可以尝试保存角色实例而不是用户,这可以在后台保存您的用户实例。 我只是尝试只保存角色实例,只保存用户数据,没有角色数据:( @Id //@GeneratedValue(strategy = GenerationType.AUTO) 你为什么评论这个

以上是关于Hibernate:防止角色表中有多个相同的条目的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在表中的多个下拉列表中选择相同的值并 POST 到服务器

hibernate多对多关联映射

当我所做的只是一个列表时,为啥 Hibernate 会删除我的集合条目?

休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?

Hibernate Envers:如何从我的审计表中删除条目?

Hibernate Envers 修改了标志行为