#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 Я забыл удалить это из текста выше. Спасибо.