Hibernate создание записей во вспомогательной таблице из List

Есть потребность в разнесении данных из бина GuestSession во вспомогательную таблицу public.accompanying_guests

Класс:

@Entity
@Table(name = "public.guest_sessions")
@SecondaryTables({
        @SecondaryTable(name = "public.accompanying_guests"),
})
public class GuestSession {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private UUID uuid;
    @Column(name = "room_uuid")
    private UUID roomUuid;
    @Column(name = "responsible_guest_uuid")
    private UUID responsibleGuestUuid;
    @Column(table = "public.accompanying_guests", name = "guest_uuid")
    private List<UUID> accompanyingGuestsUuid;
    @Column(name = "checkin_date ")
    private LocalDate checkInDate;
    @Column(name = "checkout_date")
    private LocalDate checkOutDate;
    private boolean alive;

    public GuestSession() {
    }

    public GuestSession(Room room, Guest responsibleGuest, LocalDate checkInDate, LocalDate checkOutDate,
                        Guest... accompanyingGuests) {
        this.uuid = UUID.randomUUID();
        this.roomUuid = room.getUuid();
        this.responsibleGuestUuid = responsibleGuest.getUuid();
        this.accompanyingGuestsUuid = getAccompanyingGuestsUuid(accompanyingGuests);
        this.checkInDate = checkInDate;
        this.checkOutDate = checkOutDate;
        this.alive = true;
    }

струткура БД

CREATE TABLE public.guest_sessions
(
    uuid                     character varying(64) UNIQUE NOT NULL,
    room_uuid                character varying(64)        NOT NULL,
    responsible_guest_uuid   character varying(64)        NOT NULL,
    checkin_date             date                         NOT NULL,
    checkout_date            date                         NOT NULL,
    alive                    boolean                      NOT NULL,
    CONSTRAINT guest_session_pkey PRIMARY KEY (uuid),
    CONSTRAINT responsible_guest FOREIGN KEY (responsible_guest_uuid)
        REFERENCES public.guests (uuid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT room_id FOREIGN KEY (room_uuid)
        REFERENCES public.rooms (uuid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
    TABLESPACE pg_default;

ALTER TABLE public.guest_sessions
    OWNER to postgres;

CREATE TABLE public.accompanying_guests
(
    uuid               serial UNIQUE         NOT NULL,
    guest_session_uuid character varying(64) NOT NULL,
    guest_uuid         character varying(64) NOT NULL,
    CONSTRAINT accompanying_guest_pkey PRIMARY KEY (uuid),
    CONSTRAINT guest_id FOREIGN KEY (guest_uuid)
        REFERENCES public.guests (uuid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT guest_session_id FOREIGN KEY (guest_session_uuid)
        REFERENCES public.guest_sessions (uuid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
    TABLESPACE pg_default;

ALTER TABLE public.accompanying_guests
    OWNER to postgres;

Сложность вызывает разнесение UUID из List accompanyingGuestsUuidList c попутным заполнением остальных колонок.

И пользуясь случаем, подскажите как генерировать UUID при помощи Hibernate, не очень хочется переписывать код с использованием int или Long


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

Автор решения: Михаил Артюгин

Ушел от использования UUID в сторону int с использованием автоинкремента.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true)
private int id;
@Column(name = "accompanying_guests_id")
@ElementCollection
private List<Integer> accompanyingGuestsId;

sql

create table guest_sessions
(
    id                     serial not null,
    room_id                int    not null
        constraint guest_sessions_rooms_id_fk references rooms,
    responsible_guest_id   int    not null
        constraint guest_sessions_guests_id_fk references guests,
    accompanying_guests_id int[],
    checkin_date           date   not null,
    checkout_date          date,
    alive                  bool   not null,
    constraint guest_sessions_pk primary key (id)
);

create unique index guest_sessions_id_uindex
    on guest_sessions (id);

Дополняем pom.xml зависимостью для работы с коллекциями

<!-- https://mvnrepository.com/artifact/com.vladmihalcea/hibernate-types-52 -->
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.10.0</version>
</dependency>
→ Ссылка