@eskendarov
Java-разработчик

Как в Hibernate мапить вспомогательную таблицу?

Таблица (Postgres) связывающая сущности room, user, role:

CREATE TABLE room_user_role (
    room_id  INT REFERENCES room (id) ON DELETE CASCADE,
    users_id INT REFERENCES "user" (id) ON DELETE CASCADE,
    role_id  INT REFERENCES role (id) ON DELETE CASCADE,
    CONSTRAINT room_user_role_pk PRIMARY KEY (room_id, users_id, role_id)
);

Моё представление сущности RoomUserRole:
// lombok
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
// lombok
@Entity(name = "room_user_role")
@Table(name = "room_user_role", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"room_id", "user_id", "role_id"})
})
public class RoomUserRole implements Serializable {

    private static final long serialVersionUID = 1102368085498665957L;

    @Id
    @ManyToOne()
    @JoinColumn(name = "room_id", referencedColumnName = "id")
    private Room room;

    @Id
    @ManyToOne()
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User user;

    @Id
    @ManyToOne()
    @JoinColumn(name = "role_id", referencedColumnName = "id")
    private Role role;

    // ... equals & hashcode
}

IDE подсвечивает аннотации @Id (больше одного), знаю так нельзя, но как правильно?
  • Вопрос задан
  • 520 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix
Java Software Engineer
Добрый день.
Наверное, прежде всего мне стоит уточнить один вопрос...
- Вы пытаетесь создать java код для уже готовой таблицы? (db first подход)
- Или вы пытаетесь написать java код и хотите, чтобы получилось, как в указаной таблице? (code first подход).

Если первый подход, то вам нужно описывать не сущности, а скорее работать с JDBC API.

Вам стоит предоставить больше данных про взаимодействие ваших сущностей, но могу предположить следующее:
Во-первых, сущности User & Role. Между ними скорее всего должна быть связь ManyToMany. Говоря простыми словами, у пользователя могут быть несколько ролей (админ, пользователь, модератор и т.д.). Соответственно, у вас будут 3 таблицы: users, roles, user_roles
Далее не очень понятна сущность Room. Но скорее всего это либо OneToMany & ManyToOne, либо ManyToMany.
Что касается вашей сущности RoomUserRole, то вам не нужно использовать @Id.
@UniqueConstraint должно быть достаточно.
https://www.baeldung.com/jpa-unique-constraints
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы