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

时间:2016-08-05 18:29:16

标签: java mysql hibernate spring-mvc

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

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

我的数据库中有3个表:

  • users(id,username)
  • roles_users(user_id,role_id)
  • roles(id,role)

E.g。我在Role表(ROLE_ADMINROLE_USER)中有两个角色,我保存了一个角色为ROLE_ADMIN的用户,我的roles_users表已更新,但是我的Role表中也会创建一个新行(我想阻止它)。

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

  1. 撰写仅更新我的userroles_users表格
  2. 的查询
  3. 将role-id设置为与role-name相同的id(基本上覆盖行,我现在正在执行此操作)
  4. 所以我的问题是,使用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 个答案:

答案 0 :(得分: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);

而不是上面尝试使用角色的保存方法。