@@ -109,13 +109,16 @@ public void deleteAll() {
109109 // This method should be package-private and not used as API of the service as it uses ModificationEntity and
110110 // we want to encapsulate the use of Entity related objects to this service.
111111 // Nevertheless We have to keep it public for transactional annotation.
112- public List <ModificationEntity > saveModifications (UUID groupUuid , List <ModificationEntity > modifications ) {
113- return saveModificationsNonTransactional (groupUuid , modifications );
112+ public List <ModificationInfos > saveModifications (UUID groupUuid , List <ModificationEntity > modifications ) {
113+ List <ModificationEntity > entities = saveModificationsNonTransactional (groupUuid , modifications );
114+ return entities .stream ().map (ModificationEntity ::toModificationInfos ).toList ();
114115 }
115116
116117 @ Transactional
117- public List <ModificationEntity > saveModificationInfos (UUID groupUuid , List <ModificationInfos > modifications ) {
118- return saveModificationInfosNonTransactional (groupUuid , modifications );
118+ public List <ModificationInfos > saveModificationInfos (UUID groupUuid , List <ModificationInfos > modifications ) {
119+ List <ModificationEntity > entities = saveModificationInfosNonTransactional (groupUuid , modifications );
120+ // We can't return input modifications directly because it wouldn't have the IDs coming from the saved entities
121+ return entities .stream ().map (ModificationEntity ::toModificationInfos ).toList ();
119122 }
120123
121124 private List <ModificationEntity > saveModificationInfosNonTransactional (UUID groupUuid ,
@@ -129,7 +132,7 @@ public UUID createNetworkCompositeModification(@NonNull List<UUID> modificationU
129132 CompositeModificationInfos compositeInfos = CompositeModificationInfos .builder ().modifications (List .of ()).build ();
130133 CompositeModificationEntity compositeEntity = (CompositeModificationEntity ) ModificationEntity .fromDTO (compositeInfos );
131134 List <ModificationEntity > copyEntities = modificationRepository .findAllByIdIn (modificationUuids ).stream ()
132- .map (this ::getModificationInfos )
135+ .map (this ::toModificationsInfosOptimizedForTabular )
133136 .map (ModificationEntity ::fromDTO )
134137 .toList ();
135138 compositeEntity .setModifications (copyEntities );
@@ -146,7 +149,7 @@ public void updateCompositeModification(@NonNull UUID compositeUuid, @NonNull Li
146149 }
147150
148151 List <ModificationEntity > copyEntities = modificationRepository .findAllByIdIn (modificationUuids ).stream ()
149- .map (this ::getModificationInfos )
152+ .map (this ::toModificationsInfosOptimizedForTabular )
150153 .map (ModificationEntity ::fromDTO )
151154 .toList ();
152155 compositeEntity .getModifications ().clear ();
@@ -168,11 +171,9 @@ private List<ModificationEntity> saveModificationsNonTransactional(UUID groupUui
168171 }
169172
170173 @ Transactional
171- public List <ModificationEntity > moveModifications (UUID destinationGroupUuid , UUID originGroupUuid , List <UUID > modificationsToMoveUUID , UUID referenceModificationUuid ) {
174+ public List <ModificationInfos > moveModifications (UUID destinationGroupUuid , UUID originGroupUuid , List <UUID > modificationsToMoveUUID , UUID referenceModificationUuid ) {
172175 List <ModificationEntity > movedModifications = moveModificationsNonTransactional (destinationGroupUuid , originGroupUuid , modificationsToMoveUUID , referenceModificationUuid );
173- // TODO resolve lazy initialisation exception : replace this line by loadFullModificationsEntities
174- movedModifications .forEach (ModificationEntity ::toModificationInfos );
175- return movedModifications ;
176+ return movedModifications .stream ().map (this ::toModificationsInfosOptimizedForTabular ).toList ();
176177 }
177178
178179 private List <ModificationEntity > moveModificationsNonTransactional (UUID destinationGroupUuid , UUID originGroupUuid , List <UUID > modificationsToMoveUUID , UUID referenceModificationUuid ) {
@@ -260,7 +261,7 @@ public Map<UUID, UUID> duplicateCompositeModifications(List<UUID> sourceModifica
260261 // findAllById does not keep sourceModificationUuids order, but
261262 // sourceEntities, copyEntities, newEntities have the same order.
262263 List <ModificationEntity > copyEntities = sourceEntities .stream ()
263- .map (this ::getModificationInfos )
264+ .map (this ::toModificationsInfosOptimizedForTabular )
264265 .map (ModificationEntity ::fromDTO )
265266 .toList ();
266267 List <ModificationEntity > newEntities = modificationRepository .saveAll (copyEntities );
@@ -297,13 +298,13 @@ public List<ModificationInfos> getModificationsMetadata(UUID groupUuid, boolean
297298 .findAllBaseByGroupIdReverse (getModificationGroup (groupUuid ).getId ())
298299 .stream ()
299300 .filter (ModificationEntity ::getStashed )
300- .map (this ::getModificationInfos )
301+ .map (this ::toModificationsInfosOptimizedForTabular )
301302 .collect (Collectors .toList ());
302303 } else {
303304 return modificationRepository
304305 .findAllBaseByGroupId (getModificationGroup (groupUuid ).getId ())
305306 .stream ()
306- .map (this ::getModificationInfos )
307+ .map (this ::toModificationsInfosOptimizedForTabular )
307308 .collect (Collectors .toList ());
308309 }
309310 }
@@ -408,38 +409,28 @@ private TabularBaseInfos loadTabularModification(TabularModificationsEntity tabu
408409 .build ();
409410 }
410411
411- public ModificationInfos getModificationInfos (ModificationEntity modificationEntity ) {
412+ public ModificationInfos toModificationsInfosOptimizedForTabular (ModificationEntity modificationEntity ) {
412413 if (modificationEntity instanceof TabularModificationsEntity tabularEntity ) {
413414 return loadTabularModification (tabularEntity );
414415 }
415416 return modificationEntity .toModificationInfos ();
416417 }
417418
418419 @ Transactional (readOnly = true )
419- public List <ModificationEntity > getActiveModificationsEntities (UUID groupUuid , Set <UUID > modificationsToExclude ) {
420+ public List <ModificationInfos > getActiveModifications (UUID groupUuid , Set <UUID > modificationsToExclude ) {
420421 List <ModificationEntity > modificationsEntities = modificationRepository .findAllActiveModificationsByGroupId (groupUuid , emptyIfNull (modificationsToExclude ));
421- // TODO resolve lazy initialisation exception : replace this line by loadFullModificationsEntities
422- modificationsEntities .forEach (ModificationEntity ::toModificationInfos );
423- return modificationsEntities ;
424- }
425-
426- private void loadFullModificationsEntities (List <ModificationEntity > modificationsEntities ) {
427- // Force load subentities/collections, needed later when the transaction is closed
428- // Necessary for applying network modifications
429- // to avoid LazyInitialisationException. Maybe better to refactor to return the dto ?
430- // And refactor to more efficiently load the data (avoid 1+N) ?
431- modificationsEntities .forEach (this ::getModificationInfos );
422+ return modificationsEntities .stream ().map (this ::toModificationsInfosOptimizedForTabular ).toList ();
432423 }
433424
434425 private List <ModificationInfos > getModificationsInfos (List <UUID > groupUuids , boolean onlyStashed ) {
435426 return groupUuids .stream ().flatMap (this ::getModificationEntityStream )
436427 .filter (m -> !onlyStashed || m .getStashed () == onlyStashed )
437- .map (this ::getModificationInfos ).toList ();
428+ .map (this ::toModificationsInfosOptimizedForTabular ).toList ();
438429 }
439430
440431 @ Transactional (readOnly = true )
441432 public ModificationInfos getModificationInfo (UUID modificationUuid ) {
442- return getModificationInfos (getModificationEntity (modificationUuid ));
433+ return toModificationsInfosOptimizedForTabular (getModificationEntity (modificationUuid ));
443434 }
444435
445436 public ModificationEntity getModificationEntity (UUID modificationUuid ) {
@@ -518,7 +509,7 @@ private List<ModificationInfos> getModificationsInfosNonTransactional(List<UUID>
518509 ModificationEntity ::getId ,
519510 Function .identity ()
520511 ));
521- return uuids .stream ().map (entities ::get ).filter (Objects ::nonNull ).map (this ::getModificationInfos ).toList ();
512+ return uuids .stream ().map (entities ::get ).filter (Objects ::nonNull ).map (this ::toModificationsInfosOptimizedForTabular ).toList ();
522513 }
523514
524515 /**
@@ -533,7 +524,7 @@ public List<ModificationInfos> getBasicNetworkModificationsFromComposite(@NonNul
533524 return networkModificationsUuids .stream ()
534525 .map (entitiesById ::get )
535526 .filter (Objects ::nonNull )
536- .map (this ::getModificationInfos )
527+ .map (this ::toModificationsInfosOptimizedForTabular )
537528 .toList ();
538529 }
539530
@@ -562,7 +553,7 @@ public List<ModificationInfos> getUnstashedModificationsInfos(@NonNull UUID grou
562553 }
563554
564555 private List <ModificationInfos > getUnstashedModificationsInfosNonTransactional (UUID groupUuid ) {
565- return getModificationEntityStream (groupUuid ).filter (m -> !m .getStashed ()).map (this ::getModificationInfos ).toList ();
556+ return getModificationEntityStream (groupUuid ).filter (m -> !m .getStashed ()).map (this ::toModificationsInfosOptimizedForTabular ).toList ();
566557 }
567558
568559 @ Transactional
@@ -754,14 +745,18 @@ private void deleteTabularModificationSubModifications(TabularModificationsEntit
754745 }
755746
756747 @ Transactional
757- public List <ModificationEntity > saveDuplicateModifications (@ NonNull UUID targetGroupUuid , UUID originGroupUuid , @ NonNull List <UUID > modificationsUuids ) {
748+ public List <ModificationInfos > saveDuplicateModifications (@ NonNull UUID targetGroupUuid , UUID originGroupUuid , @ NonNull List <UUID > modificationsUuids ) {
758749 List <ModificationInfos > modificationInfos = originGroupUuid != null ? getUnstashedModificationsInfosNonTransactional (originGroupUuid ) : getModificationsInfosNonTransactional (modificationsUuids );
759- return saveModificationInfosNonTransactional (targetGroupUuid , modificationInfos );
750+ List <ModificationEntity > newEntities = saveModificationInfosNonTransactional (targetGroupUuid , modificationInfos );
751+ // We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities
752+ return newEntities .stream ().map (ModificationEntity ::toModificationInfos ).toList ();
760753 }
761754
762755 @ Transactional
763- public List <ModificationEntity > saveCompositeModifications (@ NonNull UUID targetGroupUuid , @ NonNull List <UUID > modificationsUuids ) {
756+ public List <ModificationInfos > saveCompositeModifications (@ NonNull UUID targetGroupUuid , @ NonNull List <UUID > modificationsUuids ) {
764757 List <ModificationInfos > modificationInfos = getCompositeModificationsInfosNonTransactional (modificationsUuids );
765- return saveModificationInfosNonTransactional (targetGroupUuid , modificationInfos );
758+ List <ModificationEntity > newEntities = saveModificationInfosNonTransactional (targetGroupUuid , modificationInfos );
759+ // We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities
760+ return newEntities .stream ().map (ModificationEntity ::toModificationInfos ).toList ();
766761 }
767762}
0 commit comments