Как мне автоматически соединить мою таблицу пользователей с таблицей ролей

#java #hibernate

#java #спящий режим

Вопрос:

Моя таблица пользователей выглядит следующим образом:

 emp_user table
--------------
id (bigint) PK
uuid (character varying) unique
username (character varying) unique
-- no foreign keys are defined in the table
  

UserEntity Класс выглядит следующим образом:

 @Entity
@Table(name = "emp_user")
public class UserEntity {
    @Id
    private String uuid; // Because of Keycloak internals
    
    @Column(name = ""user"")
    private String username;
    
    @Column(name = "id")
    private Long identifier;
    
    @OneToMany
    JoinColumn(referencedColumnName = "emp_user_id")
    private List<Roles> rolesList;
    
    // getters and setters
}
  

У пользователя может быть много ролей.

 emp_user_roles table
--------------------
emp_user_id (bigint)
emp_user_role (character varying)
-- both emp_user_id and emp_user_role together is a key
-- no foreign keys are defined in the table
  

Roles Класс выглядит следующим образом:

 @Entity
@Table(name = "emp_user_roles")
public class Roles implements Serializable {
    @Id
    @Column(name = "emp_user_id")
    private Long userId;
    
    @Id
    @Column(name = "emp_user_role")
    private String userRole;
    
    // getters and setters
}
  

Я получаю результат, одного пользователя, со списком ролей, но внутри него нет ролей, а только сообщение об ошибке, в котором говорится Unable to evaluate the expression Method threw 'org.hibernate.exception.GenericJDBCException' exception.

Я думаю, что я делаю что-то не так.

Ответ №1:

Вы должны использовать many-to-many ассоциацию, потому что у Role может быть несколько пользователей. В таком случае Hibernate создаст таблицу объединения.

 @Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Role> roles;

}

@Entity
public class Role {

    @Id
    private Long id;

    @Column
    private String name;

}
  

Вы можете создать дополнительный объект UserRoleMapping с @ManyToOne помощью User to @ManyToOne и Role to, чтобы,,. Это будет просто добавить или удалить Role . Вам не нужно будет получать список всех ролей, чтобы удалить одну из них. Также вы можете добавить уникальное ограничение (User, Role) к UserRoleMapping .

Ответ №2:

Вот как я решил проблему:

 @Entity
@Table(name = "emp_user")
public class UserEntity implements Serializable { // <-- must implement Serializable
    @Id
    private String uuid;

    @Column(name = ""user"")
    private String username;

    @Column(name = "id")
    private Long identifier;

    @OneToMany
    @JoinColumn(name = "emp_user_id", referencedColumnName = "id") // <-- both name and referencedColumnName are required
    private List<Roles> rolesList;

    // getters and setters
}
  

Комментарии:

1. У вас дважды одно и то же имя rolesList . Переход в спящий режим не так прост, и у вас может возникнуть много проблем с такими сопоставлениями.

2. @v.ladynev Я забыл удалить это из текста выше. Спасибо.