Как настроить связь между сущностями через hibernate

Например есть две сущности Users и System . У users есть роли admin и user . Нужно чтобы Users ролями admin были связаны с System многие ко многим , а те у кого роль user , связаны один(System) ко многим (Users). Есть какой нибудь стандартный подход который предоставляет hibernate ? Также, чтобы не было конфликтов при аутентификации через spring security


Ответы (1 шт):

Автор решения: kami

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: при чтении из базы, в зависимости от значения поля-дискриминатора, создаст экземпляр нужного конечного класса, а при записи в базу - корректно его сохранит.

→ Ссылка