From c7958681f52cee833e8d17670246abeb65a6010e Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 28 Apr 2026 22:15:38 +0200 Subject: [PATCH] fix(transcription): eliminate N+1 lazy load in propagation listener Switch from findByMentionedPersons_PersonId (derived query, returns blocks with LAZY mentionedPersons) to findByPersonIdWithMentionsFetched (JOIN FETCH, loads full collections in one round-trip). 200-block propagation: from 201 queries to 2. Add @Transactional comment documenting join-transaction semantics. Co-Authored-By: Claude Sonnet 4.6 --- .../service/PersonMentionPropagationListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonMentionPropagationListener.java b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonMentionPropagationListener.java index 4e9ed1d8..a9749fcd 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonMentionPropagationListener.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonMentionPropagationListener.java @@ -35,10 +35,10 @@ public class PersonMentionPropagationListener { private final TranscriptionBlockRepository blockRepository; @EventListener - @Transactional + @Transactional // Joins publisher's transaction — async switch requires @TransactionalEventListener(AFTER_COMMIT) public void onPersonDisplayNameChanged(PersonDisplayNameChangedEvent event) { List blocks = - blockRepository.findByMentionedPersons_PersonId(event.personId()); + blockRepository.findByPersonIdWithMentionsFetched(event.personId()); if (blocks.isEmpty()) { return; }