Spring Boot: désactiver la récupération de PersistentBag par programme
J'ai une entité dans Spring Boot qui ressemble à ça:
@Entity
@Table(name = "race_class")
@Getter @Setter
public class RaceClass
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer dbid;
private String name;
private String colorHexcode;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "raceClass", cascade = CascadeType.ALL)
private List<Entry> entries;
}
Dans mon service, j'ai déjà une méthode, qui récupère toutes les entrées de la classe de course en plus. Ce qui ressemble à ça:
public List<RaceClassDto> getClassesEntries( int eventDbid )
{
return this.raceClassRepo.findByEventDbid( eventDbid )
.stream()
.map( c -> addEntriesToRaceClass( eventDbid, c ) )
.map( raceClassMapper :: mapToDto )
.collect( Collectors.toList() );
}
Le mappeur ressemble à ça:
public RaceClassDto mapToDto( RaceClass raceClass )
{
return modelMapper.map ( raceClass, RaceClassDto.class );
}
Maintenant, je veux avoir une deuxième méthode, qui ne récupère pas les entrées automatiquement. Mais voici exactement mon problème. La nouvelle méthode ressemblerait à ceci:
public List<RaceClassDto> getClasses( int eventDbid )
{
return this.raceClassRepo.findByEventDbid( eventDbid )
.stream()
.map( raceClassMapper :: mapToDto )
.collect( Collectors.toList() );
}
Mais les entrées seront néanmoins récupérées, car getEntries () sera appelée dans le DTO-Mapper, qui exécute automatiquement les requêtes de sélection et remplit le conteneur d'entrées. Comment est-il possible de désactiver par programme la synchronisation automatique du PersistentBag uniquement pour la méthode getClassesEntries ()?
Réponses
Je pense que vous ne pouvez pas désactiver par programme la résolution des relations.
Une meilleure approche sera de définir une nouvelle méthode dans votre mappeur, de la nommer mapToDTOWithoutResolvingEntrieset de ne pas résoudre la relation dans cette méthode.
Pour vos commentaires, si vous utilisez ModelMapper, dans votre cas d'utilisation spécifique, vous pouvez peut-être ignorer la entriespropriété de votre DTO.
Veuillez essayer quelque chose comme ce qui suit:
public RaceClassDto mapToDTOWithoutResolvingEntries( RaceClass raceClass) {
return modelMapperWithoutResolvingEntries
.map ( raceClass, RaceClassDto.class );
}
Où modelMapperWithoutResolvingEntriesest le même que modelMappervous avez défini précédemment avec ce qui suit mappingajouté:
ModelMapper modelMapperWithoutResolvingEntries = new ModelMapper();
modelMapperWithoutResolvingEntries
.addMappings(mapper -> mapper.skip(RaceClassDto::setEntries));
Vous pouvez utiliser create a à la TypeMapplace, il devrait se comporter de la même manière.
Vous avez d'autres alternatives. Par exemple, vous pouvez fournir le vôtre PropertyMap(s'il vous plaît, voir le javadoc pertinent et comment ils écrasent la configureméthode), ou peut-être même un fichier Converter.
Je pense que cela modelMapperprovient de la bibliothèque ModelMapper , donc dans ce cas, vous pouvez lui dire de ne pas mapper les entrées, comme indiqué dans cette question .
Sinon, vous pouvez probablement copier les données de l'objet chargé JPA dans un autre objet à l'exclusion des données extraites paresseusement.