Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:防止角色表中出现多个相同的条目_Java_Mysql_Hibernate_Spring Mvc - Fatal编程技术网

Java Hibernate:防止角色表中出现多个相同的条目

Java Hibernate:防止角色表中出现多个相同的条目,java,mysql,hibernate,spring-mvc,Java,Mysql,Hibernate,Spring Mvc,每当我将用户及其角色保存到数据库时,它也会在我的角色表中添加额外的行 每个用户都有许多角色,每个角色可以属于多个用户) 我的数据库中有3个表: 用户(id、用户名) 角色用户(用户id,角色id) 角色(id,角色) 例如,我在我的Role表中有两个角色(Role\u ADMIN,Role\u USER),我用RoleRole\u ADMIN保存一个用户,我的roles\u users表被更新,但在我的Role表中也创建了一个新行(我想防止这种情况发生) 有几种方法可以防止这种情况发生: 编

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

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

我的数据库中有3个表:

  • 用户
    (id、用户名)
  • 角色用户
    (用户id,角色id)
  • 角色
    (id,角色)
例如,我在我的
Role
表中有两个角色(
Role\u ADMIN
Role\u USER
),我用Role
Role\u ADMIN
保存一个用户,我的
roles\u users
表被更新,但在我的
Role
表中也创建了一个新行(我想防止这种情况发生)

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

  • 编写一个仅更新我的
    用户
    角色\u用户
    表的查询
  • 将角色id设置为与角色名称相同的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);
    

    尝试使用角色的save方法,而不是上面的方法。

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