Как обрабатывать случаи "при конфликте и обновлении" в Jpa / Hibernate? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь сохранить информацию журнала в базе данных 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?

...