Tengo una entidad en Spring Boot que se ve así:
@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; }En mi servicio ya tengo un método, que extrae todas las entradas de la clase de carrera adicionalmente. Que se parece a eso:
public List<RaceClassDto> getClassesEntries( int eventDbid ) { return this.raceClassRepo.findByEventDbid( eventDbid ) .stream() .map( c -> addEntriesToRaceClass( eventDbid, c ) ) .map( raceClassMapper :: mapToDto ) .collect( Collectors.toList() ); }El mapeador se ve así:
public RaceClassDto mapToDto( RaceClass raceClass ) { return modelMapper.map ( raceClass, RaceClassDto.class ); }Ahora, quiero tener un segundo método, que no obtenga las entradas automáticamente. Pero exactamente aquí está mi problema. El nuevo método se vería así:
public List<RaceClassDto> getClasses( int eventDbid ) { return this.raceClassRepo.findByEventDbid( eventDbid ) .stream() .map( raceClassMapper :: mapToDto ) .collect( Collectors.toList() ); }Sin embargo, las entradas se recuperarán, ya que se llamará a getEntries() en DTO-Mapper, que ejecuta las consultas de selección automáticamente y llena el contenedor de entradas. ¿Cómo es posible deshabilitar mediante programación la sincronización automática de PersistentBag solo para el método getClassesEntries()?
Creo que no puede deshabilitar mediante programación la resolución de la relación.
Un mejor enfoque será definir un nuevo método en su asignador, asígnele el nombre mapToDTOWithoutResolvingEntries y no resuelva la relación en ese método.
Para sus comentarios, si está utilizando ModelMapper, en su caso de uso específico, tal vez pueda omitir la propiedad de entries de su DTO.
Por favor, intente algo como lo siguiente:
public RaceClassDto mapToDTOWithoutResolvingEntries( RaceClass raceClass) { return modelMapperWithoutResolvingEntries .map ( raceClass, RaceClassDto.class ); } Donde modelMapperWithoutResolvingEntries es el mismo modelMapper que definiste antes con la siguiente mapping agregada:
ModelMapper modelMapperWithoutResolvingEntries = new ModelMapper(); modelMapperWithoutResolvingEntries .addMappings(mapper -> mapper.skip(RaceClassDto::setEntries)); Puede usar crear un TypeMap en su lugar, debería comportarse de la misma manera.
Tienes otras alternativas. Por ejemplo, puede proporcionar su propio PropertyMap (consulte eljavadoc relevante y cómo sobrescriben el método de configure ), o tal vez incluso unConverter .
Creo que modelMapper proviene de la biblioteca ModelMapper , por lo que, en este caso, podría indicarle que omita el mapeo de las entradas, como se indica en esta pregunta .
De lo contrario, probablemente pueda copiar los datos del objeto JPA cargado en otro objeto, excluyendo los datos obtenidos de forma perezosa.