Я пытаюсь сохранить информацию журнала в базе данных PostGreSQL, используя Hibernate (и Spring Data). В этом конкретном случае мне нужно хранить простой пользовательский журнал событий.
Схема:
CREATE TABLE LogIn (
userId VARCHAR(255) NOT NULL,
siteId VARCHAR(255) NOT NULL,
lastLogin BIGINT,
PRIMARY KEY(userId, siteId) -- note the composite primary key
)
Семантика таблицы проста: для каждого пользователя мы хотим отслеживать последний раз (и только последний раз), когда они вошли на конкретный сайт.
Мой вопрос: Учитывая (потенциально очень длинный) List<LogIn>
в Java, как я могу эффективно сохранить их с помощью Hibernate? Нам нужно учесть, что некоторые комбинации userId/siteId
уже есть в таблице, другие могут отсутствовать.
Я бы настоятельно предпочел не выполнять один запрос на выборку для каждой комбинации, чтобы проверить, существует ли он, обновить сущность и сохранить ее по соображениям производительности.
С простым SQL я бы подготовил готовое утверждение, например так:
PREPARE savePlan(VARCHAR(255), VARCHAR(255), BIGINT) AS
INSERT INTO LogIn(userId, siteId, lastLogin) VALUES($1,$2,$3)
ON CONFLICT(userId, siteId) DO UPDATE SET lastLogin = $3;
... и затем вызывать EXECUTE savePlan(...)
один раз для каждой записи списка в одном запросе SQL.
Как мне это сделать с помощью Hibernate и Spring Data?