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

标签 java mysql hibernate spring-mvc

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

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

我的数据库中有 3 个表:

  • 用户(id,用户名)
  • roles_users (user_id, role_id)
  • 角色(id,角色)

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

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

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

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

这是我的用户模型:

@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;
}
}

这是我的角色模型:

@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);

最佳答案

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

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);

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

关于java - Hibernate:防止角色表中有多个相同的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795699/

相关文章:

java - 带有 SSL 的 RMI - 服务器启动时的握手异常(没有共同的密码套件)

java - 如何标记重复的元素?

PHP PDO setAttribute 和错误处理

mysql - SQL:跨多个表查找产品价格的平均涨幅?

hibernate - 领域驱动设计 - 领域模型与 Hibernate 实体

hibernate - 抛出异常时回滚事务并关闭连接

java - 使用服务器端代码 java 检测请求是来自手机、平板电脑还是台式机

java - sqlite 中的列类型 NONE

php - Web 服务更新错误

java - 如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java 配置