Skip to content
This repository was archived by the owner on May 21, 2026. It is now read-only.

Commit 3994a15

Browse files
Fix LazyInitializationException for all lazy collections in MediaModel (virtual threads) (#72)
* Initial plan * fix: add MediaLazyLoader to prevent LazyInitializationException on all lazy Set<> collections Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> Agent-Logs-Url: https://github.com/EspacoGeek-Teams/SpringAPI_EspacoGeek/sessions/19f27d26-cd82-4094-a4ab-9fe909c892cc --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com>
1 parent 7c75241 commit 3994a15

16 files changed

Lines changed: 153 additions & 37 deletions

src/main/java/com/espacogeek/geek/data/impl/GenericMediaDataControllerImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.espacogeek.geek.services.GenreService;
3333
import com.espacogeek.geek.services.MediaService;
3434
import com.espacogeek.geek.services.SeasonService;
35+
import com.espacogeek.geek.utils.MediaLazyLoader;
3536

3637
import jakarta.persistence.Id;
3738
import jakarta.persistence.ManyToMany;
@@ -48,20 +49,23 @@ public class GenericMediaDataControllerImpl implements MediaDataController {
4849
private final AlternativeTitlesService alternativeTitlesService;
4950
private final ExternalReferenceService externalReferenceService;
5051
private final SeasonService seasonService;
52+
private final MediaLazyLoader mediaLazyLoader;
5153

5254
@Autowired
5355
public GenericMediaDataControllerImpl(
5456
@Lazy MediaService mediaService,
5557
GenreService genreService,
5658
AlternativeTitlesService alternativeTitlesService,
5759
ExternalReferenceService externalReferenceService,
58-
SeasonService seasonService
60+
SeasonService seasonService,
61+
MediaLazyLoader mediaLazyLoader
5962
) {
6063
this.mediaService = mediaService;
6164
this.genreService = genreService;
6265
this.alternativeTitlesService = alternativeTitlesService;
6366
this.externalReferenceService = externalReferenceService;
6467
this.seasonService = seasonService;
68+
this.mediaLazyLoader = mediaLazyLoader;
6569
}
6670

6771
public GenericMediaDataControllerImpl getInstance() {
@@ -73,6 +77,8 @@ public GenericMediaDataControllerImpl getInstance() {
7377
*/
7478
@Override
7579
public MediaModel updateAllInformation(MediaModel media, MediaModel result, TypeReferenceModel typeReference, MediaApi mediaApi) {
80+
mediaLazyLoader.initializeCollections(media);
81+
7682
if (result == null) {
7783
Collection<ExternalReferenceModel> externalReferences = media.getExternalReference();
7884
if (externalReferences == null || !Hibernate.isInitialized(externalReferences)) {

src/main/java/com/espacogeek/geek/data/impl/MovieControllerImpl.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.espacogeek.geek.services.MediaCategoryService;
2929
import com.espacogeek.geek.services.SeasonService;
3030
import com.espacogeek.geek.services.TypeReferenceService;
31+
import com.espacogeek.geek.utils.MediaLazyLoader;
3132

3233
import jakarta.annotation.PostConstruct;
3334

@@ -51,9 +52,10 @@ public MovieControllerImpl(
5152
GenreService genreService,
5253
AlternativeTitlesService alternativeTitlesService,
5354
ExternalReferenceService baseExternalReferenceService,
54-
SeasonService seasonService
55+
SeasonService seasonService,
56+
MediaLazyLoader mediaLazyLoader
5557
) {
56-
super(mediaService, genreService, alternativeTitlesService, baseExternalReferenceService, seasonService);
58+
super(mediaService, genreService, alternativeTitlesService, baseExternalReferenceService, seasonService, mediaLazyLoader);
5759
this.movieAPI = movieAPI;
5860
this.mediaCategoryService = mediaCategoryService;
5961
this.externalReferenceService = externalReferenceService;

src/main/java/com/espacogeek/geek/data/impl/SerieControllerImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99

1010
import com.espacogeek.geek.services.*;
11+
import com.espacogeek.geek.utils.MediaLazyLoader;
1112
import lombok.extern.slf4j.Slf4j;
1213
import org.json.simple.JSONObject;
1314
import org.springframework.beans.factory.annotation.Qualifier;
@@ -33,8 +34,8 @@ public class SerieControllerImpl extends GenericMediaDataControllerImpl {
3334

3435
private TypeReferenceModel typeReference;
3536

36-
public SerieControllerImpl(MediaService mediaService, GenreService genreService, AlternativeTitlesService alternativeTitlesService, ExternalReferenceService externalReferenceService, SeasonService seasonService, MediaApi tvSeriesApi, MediaCategoryService mediaCategoryService, ExternalReferenceService externalReferenceService1, TypeReferenceService typeReferenceService) {
37-
super(mediaService, genreService, alternativeTitlesService, externalReferenceService, seasonService);
37+
public SerieControllerImpl(MediaService mediaService, GenreService genreService, AlternativeTitlesService alternativeTitlesService, ExternalReferenceService externalReferenceService, SeasonService seasonService, MediaApi tvSeriesApi, MediaCategoryService mediaCategoryService, ExternalReferenceService externalReferenceService1, TypeReferenceService typeReferenceService, MediaLazyLoader mediaLazyLoader) {
38+
super(mediaService, genreService, alternativeTitlesService, externalReferenceService, seasonService, mediaLazyLoader);
3839
this.tvSeriesApi = tvSeriesApi;
3940
this.mediaCategoryService = mediaCategoryService;
4041
this.externalReferenceService = externalReferenceService1;

src/main/java/com/espacogeek/geek/repositories/AlternativeTitlesRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
@Repository
1313
public interface AlternativeTitlesRepository extends JpaRepository<AlternativeTitleModel, Integer> {
1414

15+
List<AlternativeTitleModel> findByMedia(MediaModel media);
16+
1517
List<AlternativeTitleModel> findByMediaIn(Collection<MediaModel> medias);
1618

1719
}

src/main/java/com/espacogeek/geek/repositories/GenreRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@
33
import java.util.List;
44

55
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
68
import org.springframework.stereotype.Repository;
79

810
import com.espacogeek.geek.models.GenreModel;
911

1012
@Repository
1113
public interface GenreRepository extends JpaRepository<GenreModel, Integer> {
1214
public List<GenreModel> findAllByNameIn(List<String> nameGenres);
15+
16+
@Query("SELECT g FROM MediaModel m JOIN m.genre g WHERE m.id = :mediaId")
17+
List<GenreModel> findByMediaId(@Param("mediaId") Integer mediaId);
1318
}

src/main/java/com/espacogeek/geek/repositories/SeasonRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
@Repository
1313
public interface SeasonRepository extends JpaRepository<SeasonModel, Integer> {
1414

15+
List<SeasonModel> findByMedia(MediaModel media);
16+
1517
List<SeasonModel> findByMediaIn(Collection<MediaModel> medias);
1618

1719
}

src/main/java/com/espacogeek/geek/services/AlternativeTitlesService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import org.springframework.dao.DataIntegrityViolationException;
66

77
import com.espacogeek.geek.models.AlternativeTitleModel;
8+
import com.espacogeek.geek.models.MediaModel;
89

910
public interface AlternativeTitlesService {
1011
public List<AlternativeTitleModel> saveAll(List<AlternativeTitleModel> alternativeTitles) throws DataIntegrityViolationException;
12+
13+
public List<AlternativeTitleModel> findAll(MediaModel media);
1114
}

src/main/java/com/espacogeek/geek/services/GenreService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import java.util.List;
44

55
import com.espacogeek.geek.models.GenreModel;
6+
import com.espacogeek.geek.models.MediaModel;
67

78
public interface GenreService {
89
public List<GenreModel> findAllByNames(List<String> names);
910

11+
public List<GenreModel> findAll(MediaModel media);
12+
1013
public List<GenreModel> saveAll(List<GenreModel> genres);
1114
}

src/main/java/com/espacogeek/geek/services/SeasonService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import java.util.List;
44

5+
import com.espacogeek.geek.models.MediaModel;
56
import com.espacogeek.geek.models.SeasonModel;
67

78
public interface SeasonService {
89
public List<SeasonModel> saveAll(List<SeasonModel> seasons);
10+
11+
public List<SeasonModel> findAll(MediaModel media);
912
}

src/main/java/com/espacogeek/geek/services/impl/AlternativeTitlesServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.stereotype.Service;
88

99
import com.espacogeek.geek.models.AlternativeTitleModel;
10+
import com.espacogeek.geek.models.MediaModel;
1011
import com.espacogeek.geek.repositories.AlternativeTitlesRepository;
1112
import com.espacogeek.geek.services.AlternativeTitlesService;
1213

@@ -18,4 +19,9 @@ public class AlternativeTitlesServiceImpl implements AlternativeTitlesService {
1819
public List<AlternativeTitleModel> saveAll(List<AlternativeTitleModel> alternativeTitles) throws DataIntegrityViolationException {
1920
return alternativeTitlesRepository.saveAll(alternativeTitles);
2021
}
22+
23+
@Override
24+
public List<AlternativeTitleModel> findAll(MediaModel media) {
25+
return alternativeTitlesRepository.findByMedia(media);
26+
}
2127
}

0 commit comments

Comments
 (0)