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>