Как настроить связь между сущностями через hibernate
Например есть две сущности Users и System . У users есть роли admin и user . Нужно чтобы Users ролями admin были связаны с System многие ко многим , а те у кого роль user , связаны один(System) ко многим (Users). Есть какой нибудь стандартный подход который предоставляет hibernate ? Также, чтобы не было конфликтов при аутентификации через spring security
Ответы (1 шт):
Hibernate поддерживает разные виды наследования.
Судя по описанию задачи - лучше всего подойдет discriminator values
Потребуется общий предок для классов Admin и User, а дискриминатором для них как раз и будет поле role
Итого, структура будет выглядеть примерно так:
@Entity(name="users")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // одна таблица на всех, но стоит посмотреть и другие варианты, например JOINED
@DiscriminatorColumn(name="user_role", discriminatorType = DiscriminatorType.INTEGER)
public class CommonUser {
// ... здесь поле user_role не нужно описывать, опираться придется на класс
}
@Entity
@DiscriminatorValue("1")
public class Admin extends CommonUser {
// ... уже здесь, в конечном классе, использовать @ManyToMany
}
@Entity
@DiscriminatorValue("2")
public class User extends CommonUser {
// ... уже здесь, в конечном классе, использовать @OneToMany
}
Остальное возьмет на себя Hibernate: при чтении из базы, в зависимости от значения поля-дискриминатора, создаст экземпляр нужного конечного класса, а при записи в базу - корректно его сохранит.