Spring Boot: PersistentBag'in getirilmesini programlı olarak devre dışı bırakın

Nov 13 2020

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

1 jccampanero Nov 13 2020 at 20:50

İ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.

1 MAnouti Nov 13 2020 at 20:50

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.