@Skoleev

Какую аннотацию лучше всего использовать для ролей ( для Hibernate ) в Spring?

Вот к примеру, у меня

@Enumerated(EnumType.STRING)
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<Role> roles;r>

Оно создало одну табличку USER_ROLES
Где при создании каждого пользователя оно заново прописывает его роль текстом и указывает id.
Является ли такой подход хорош в плане оптимизации? Или есть какой-то другой, более хороший?
Например, две таблицы и соединяющая их одна, чтобы постоянно не повторялись одни значения, а просто указывался id роли.

Я буду рад ответам, очень хочу начинать писать хорошие приложения с самого начала.
  • Вопрос задан
  • 321 просмотр
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Я обычно делаю это иным образом.
1) создаю enum UserRole, UserPrivilege
2) создаю entity Role. При необходимости можно еще добавить сет из Privilege для каждой роли
3) Далее каждый entity содержит роль или сет ролей.
4) сущность User связываю с сущностью UserRole

Вот, исходники:
Сущность User
@Entity
@Data
@Table(name = "users")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class User {

  //...

  @JsonBackReference
  @ToString.Exclude
  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(
      name = "users_roles",
      joinColumns = @JoinColumn(name = "user_id"),
      inverseJoinColumns = @JoinColumn(name = "role_id"))
  private Set<Role> roles;

}


Сущность Role
@Entity
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name = "roles")
public class Role implements GrantedAuthority {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE)
  private Long roleId;

  @JsonBackReference
  @ToString.Exclude
  @ManyToMany(mappedBy = "roles")
  private Collection<User> users;

  @JsonBackReference
  @ToString.Exclude
  @ManyToMany
  @JoinTable(
      name = "roles_privileges",
      joinColumns = @JoinColumn(name = "role_id"),
      inverseJoinColumns = @JoinColumn(name = "privilege_id"))
  private Collection<Privilege> privileges;

  @Enumerated(EnumType.STRING)
  private UserRole name;

  public Role() {
    super();
  }

  public Role(UserRole name) {
    super();
    this.name = name;
  }

  @Override
  public String getAuthority() {
    return name.name();
  }
}


enum UserRole
public enum UserRole {
  USER,
  ADMIN
}


сущность Privilege
@Entity
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name = "privileges")
public class Privilege {

  

  @Enumerated(EnumType.STRING)
  private UserPrivilege name;

  @JsonBackReference
  @ToString.Exclude
  @ManyToMany(mappedBy = "privileges")
  private Collection<Role> roles;


}


enum UserPrivilege
public enum UserPrivilege {
  ADMIN_PRIVILEGE,
  READ_PRIVILEGE,
  WRITING_COMMENTS_PRIVILEGE
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Я в Джава вообще ноль, однако когда баловался со Спрингом - статьи на этом сайте очень помогали.

https://www.baeldung.com/role-and-privilege-for-sp...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы