Spring Boot: PersistentBag'in getirilmesini programlı olarak devre dışı bırakın
Spring Boot'ta şuna benzeyen bir varlığım var:
@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;
}
Hizmetimde zaten yarış sınıfının tüm girişlerini ek olarak getiren bir yöntemim var. Hangisi şuna benziyor:
public List<RaceClassDto> getClassesEntries( int eventDbid )
{
return this.raceClassRepo.findByEventDbid( eventDbid )
.stream()
.map( c -> addEntriesToRaceClass( eventDbid, c ) )
.map( raceClassMapper :: mapToDto )
.collect( Collectors.toList() );
}
Eşleyici şuna benzer:
public RaceClassDto mapToDto( RaceClass raceClass )
{
return modelMapper.map ( raceClass, RaceClassDto.class );
}
Şimdi, girdileri otomatik olarak getirmeyen ikinci bir yönteme sahip olmak istiyorum. Ama benim sorunum tam olarak burada. Yeni yöntem şöyle görünecektir:
public List<RaceClassDto> getClasses( int eventDbid )
{
return this.raceClassRepo.findByEventDbid( eventDbid )
.stream()
.map( raceClassMapper :: mapToDto )
.collect( Collectors.toList() );
}
Ancak yine de girdiler getirilecektir, çünkü getEntries (), seçme sorgularını otomatik olarak yürüten ve girdi kabını dolduran DTO-Mapper'da çağrılacaktır. PersistentBag'in otomatik senkronizasyonunu yalnızca getClassesEntries () yöntemi için programlı olarak devre dışı bırakmak nasıl mümkün olabilir?
Yanıtlar
İlişki çözümünü programlı olarak devre dışı bırakamayacağınızı düşünüyorum.
Eşleştiricinizde yeni bir yöntem tanımlamak, onu adlandırmak mapToDTOWithoutResolvingEntriesve bu yöntemdeki ilişkiyi çözmemek daha iyi bir yaklaşım olacaktır .
Eğer ModelMapper kullanıyorsanız, yorumlar için, özel kullanım durumunda, belki olabilir atlamakentries için DTO özelliği.
Lütfen aşağıdaki gibi bir şey deneyin:
public RaceClassDto mapToDTOWithoutResolvingEntries( RaceClass raceClass) {
return modelMapperWithoutResolvingEntries
.map ( raceClass, RaceClassDto.class );
}
Aşağıdakileri ekleyerek daha önce tanımladığınız modelMapperWithoutResolvingEntriesaynı nerede :modelMappermapping
ModelMapper modelMapperWithoutResolvingEntries = new ModelMapper();
modelMapperWithoutResolvingEntries
.addMappings(mapper -> mapper.skip(RaceClassDto::setEntries));
Bunun TypeMapyerine create a kullanabilirsiniz , aynı şekilde davranmalıdır.
Başka alternatifleriniz var. Örneğin, kendinizinkini sağlayabilirsiniz PropertyMap(lütfen ilgili javadoc'a ve configureyöntemin üzerine nasıl yazdıklarına bakın ) veya hatta bir Converter.
ModelMapper kitaplığındanmodelMapper geldiğine inanıyorum , bu nedenle bu durumda, bu soruda ele alındığı gibi, girişleri eşlemeyi atlamasını söyleyebilirsiniz .
Aksi takdirde, veriyi JPA yüklü nesneden başka bir nesneye, tembel olarak getirilen verileri hariç tutarak kopyalayabilirsiniz.