diff --git a/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java b/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java index 06e713a..834d80f 100644 --- a/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java +++ b/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java @@ -21,8 +21,17 @@ public interface NotificationLogRepository extends JpaRepositoryИспользуется в {@code IdempotencyGuard.shouldSend()}. + * + *

Без {@code @Modifying} — native INSERT с RETURNING clause работает + * как SELECT-shaped query (returns 0..1 rows). {@code @Modifying} ограничивает + * return type до {@code void/int/Integer}, что несовместимо с {@code Optional} + * → Spring Data JPA throws InvalidDataAccessApiUsageException на каждом + * dispatcher tick. Bug history: {@code @Modifying} добавили cargo-cult'ом + * (INSERT ⇒ mutating), but native + RETURNING — read-shaped в JPA model. + * Эта misconfiguration блокировала весь dispatch pipeline — пока race + * не был fix'нут в MR !214, ошибка вообще не surface'илась (events не + * doходили до tryClaim). */ - @Modifying @Query(value = """ INSERT INTO notification_log (event_id, event_type, draft_id, channel, recipient, status, sent_at) VALUES (:eventId, :eventType, :draftId, :channel, :recipient, 'PENDING', NOW())