Spring Boot: Nonaktifkan pengambilan PersistentBag secara terprogram
Saya memiliki entitas di Spring Boot yang terlihat seperti itu:
@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;
}
Dalam layanan saya, saya sudah memiliki satu metode, yang mengambil semua entri kelas balap sebagai tambahan. Yang terlihat seperti itu:
public List<RaceClassDto> getClassesEntries( int eventDbid )
{
return this.raceClassRepo.findByEventDbid( eventDbid )
.stream()
.map( c -> addEntriesToRaceClass( eventDbid, c ) )
.map( raceClassMapper :: mapToDto )
.collect( Collectors.toList() );
}
Pemeta terlihat seperti itu:
public RaceClassDto mapToDto( RaceClass raceClass )
{
return modelMapper.map ( raceClass, RaceClassDto.class );
}
Sekarang, saya ingin memiliki metode kedua, yang tidak mengambil entri secara otomatis. Tapi sebenarnya di sinilah masalah saya. Metode baru akan terlihat seperti ini:
public List<RaceClassDto> getClasses( int eventDbid )
{
return this.raceClassRepo.findByEventDbid( eventDbid )
.stream()
.map( raceClassMapper :: mapToDto )
.collect( Collectors.toList() );
}
Namun entri akan diambil, karena getEntries () akan dipanggil di DTO-Mapper, yang mengeksekusi kueri pemilihan secara otomatis dan mengisi wadah entri. Bagaimana mungkin untuk secara terprogram menonaktifkan sinkronisasi otomatis dari PersistentBag hanya untuk metode getClassesEntries ()?
Jawaban
Saya rasa Anda tidak dapat menonaktifkan resolusi hubungan secara terprogram.
Pendekatan yang lebih baik adalah dengan mendefinisikan metode baru di mapper Anda, menamainya mapToDTOWithoutResolvingEntries, dan tidak menyelesaikan hubungan dalam metode itu.
Untuk komentar Anda, jika Anda menggunakan ModelMapper, dalam kasus penggunaan khusus Anda, mungkin Anda dapat melewatkan satu entriesmilik DTO Anda.
Silakan, coba sesuatu seperti berikut ini:
public RaceClassDto mapToDTOWithoutResolvingEntries( RaceClass raceClass) {
return modelMapperWithoutResolvingEntries
.map ( raceClass, RaceClassDto.class );
}
Dimana modelMapperWithoutResolvingEntriessama yang modelMapperAnda tentukan sebelumnya dengan yang berikut mappingditambahkan:
ModelMapper modelMapperWithoutResolvingEntries = new ModelMapper();
modelMapperWithoutResolvingEntries
.addMappings(mapper -> mapper.skip(RaceClassDto::setEntries));
Anda dapat menggunakan create a TypeMapsebagai gantinya, itu harus berperilaku sama.
Anda punya alternatif lain. Misalnya, Anda dapat memberikan milik Anda sendiri PropertyMap(harap, lihat javadoc yang relevan dan bagaimana mereka menimpa configuremetode tersebut), atau bahkan mungkin file Converter.
Saya yakin modelMapperberasal dari pustaka ModelMapper , jadi dalam hal ini Anda dapat mengatakannya untuk melewati pemetaan entri, seperti yang dibahas dalam pertanyaan ini .
Jika tidak, Anda mungkin dapat menyalin data dari objek yang dimuat JPA ke objek lain tidak termasuk data yang diambil dengan malas tersebut.