From b0746de1285549a16af5e31d78f7931f15faf5b9 Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Mon, 4 May 2026 03:50:00 +0300 Subject: [PATCH] =?UTF-8?q?fix(rest-api):=20saveAndFlush=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20update=20record=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BF=D0=B0=D0=B4=D0=B0=D0=BB=20exclusion=20con?= =?UTF-8?q?straint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update bitemporal записи: close old (set valid_to = new valid_from) → insert new. Hibernate batch'ил эти два save() и до commit'а UPDATE не flush'ился. PostgreSQL видел что старая запись имеет valid_to=FAR_FUTURE и tstzrange новой записи пересекался → 23P01 conflicting key value violates exclusion constraint dictionary_records_no_overlap → 500 для пользователя. Заменил repository.save(current) на saveAndFlush(current) — UPDATE летит в БД до INSERT, range'ы становятся [from1, X) и [X, to2) и не пересекаются. --- .../ordinis/restapi/service/DictionaryRecordService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/service/DictionaryRecordService.java b/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/service/DictionaryRecordService.java index 3057c93..4dfc784 100644 --- a/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/service/DictionaryRecordService.java +++ b/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/service/DictionaryRecordService.java @@ -115,7 +115,10 @@ public class DictionaryRecordService { UUID previousRecordId = current.getId(); current.setValidTo(newValidFrom); - repository.save(current); + // saveAndFlush обязателен: иначе Hibernate отложит UPDATE до commit, INSERT новой + // записи пойдёт первым → exclusion constraint dictionary_records_no_overlap бьёт, + // т.к. старая ещё имеет valid_to=FAR_FUTURE и tstzrange'и пересекаются. + repository.saveAndFlush(current); var next = new DictionaryRecord( UUID.randomUUID(),