From b8505e0de57f9361b209529b89674b8fb1801082 Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 18 May 2026 16:49:56 +0200 Subject: [PATCH] fix(document): add @Transactional to read methods that access lazy collections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getDocumentById: add @Transactional(readOnly=true) — calls tagService.resolveEffectiveColors(doc.getTags()) which requires an open session after the LAZY switch - getRecentActivity: add @Transactional(readOnly=true) — callers may access tags/receivers on the returned list; keeps session open for @BatchSize fetches - updateDocumentTags: add @Transactional — write method was missing annotation Also adds @JsonIgnoreProperties({"hibernateLazyInitializer","handler"}) to Person and Tag to prevent Jackson serialization errors on uninitialized lazy proxies. Co-Authored-By: Claude Sonnet 4.6 --- .../org/raddatz/familienarchiv/document/DocumentService.java | 3 +++ .../main/java/org/raddatz/familienarchiv/person/Person.java | 3 +++ backend/src/main/java/org/raddatz/familienarchiv/tag/Tag.java | 2 ++ 3 files changed, 8 insertions(+) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java b/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java index 413216dc..2b428b70 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java @@ -447,6 +447,7 @@ public class DocumentService { return saved; } + @Transactional public Document updateDocumentTags(UUID docId, List tagNames) { Document doc = documentRepository.findById(docId) .orElseThrow(() -> DomainException.notFound(ErrorCode.DOCUMENT_NOT_FOUND, "Document not found: " + docId)); @@ -636,6 +637,7 @@ public class DocumentService { } // 0. Zuletzt aktive Dokumente (sortiert nach updatedAt DESC) + @Transactional(readOnly = true) public List getRecentActivity(int size) { return documentRepository.findAll( PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "updatedAt")) @@ -843,6 +845,7 @@ public class DocumentService { documentRepository.save(doc); } + @Transactional(readOnly = true) public Document getDocumentById(UUID id) { Document doc = documentRepository.findById(id) .orElseThrow(() -> DomainException.notFound(ErrorCode.DOCUMENT_NOT_FOUND, "Document not found: " + id)); diff --git a/backend/src/main/java/org/raddatz/familienarchiv/person/Person.java b/backend/src/main/java/org/raddatz/familienarchiv/person/Person.java index b3ad7b0d..c99a6f76 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/person/Person.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/person/Person.java @@ -1,6 +1,7 @@ package org.raddatz.familienarchiv.person; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.*; import lombok.*; @@ -9,6 +10,8 @@ import org.raddatz.familienarchiv.user.DisplayNameFormatter; import java.util.ArrayList; import java.util.List; import java.util.UUID; + +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) @Entity @Table(name = "persons") @Data diff --git a/backend/src/main/java/org/raddatz/familienarchiv/tag/Tag.java b/backend/src/main/java/org/raddatz/familienarchiv/tag/Tag.java index 508d7f12..8be07fdc 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/tag/Tag.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/tag/Tag.java @@ -2,10 +2,12 @@ package org.raddatz.familienarchiv.tag; import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.*; import lombok.*; +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) @Entity @Data @NoArgsConstructor