Spring Boot : 프로그래밍 방식으로 PersistentBag 가져 오기 비활성화

Nov 13 2020

Spring Boot에 다음과 같은 엔티티가 있습니다.

@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;
}

내 서비스에는 이미 raceclass의 모든 항목을 추가로 가져 오는 하나의 메서드가 있습니다. 다음과 같이 보입니다.

public List<RaceClassDto> getClassesEntries( int eventDbid )
{
    return this.raceClassRepo.findByEventDbid( eventDbid )
        .stream()
        .map( c -> addEntriesToRaceClass( eventDbid, c ) )
        .map( raceClassMapper :: mapToDto )
        .collect( Collectors.toList() );
}

매퍼는 다음과 같습니다.

public RaceClassDto mapToDto( RaceClass raceClass )
{
    return modelMapper.map ( raceClass, RaceClassDto.class );
}

이제 항목을 자동으로 가져 오지 않는 두 번째 방법이 필요합니다. 그러나 정확히 여기에 내 문제가 있습니다. 새로운 방법은 다음과 같습니다.

public List<RaceClassDto> getClasses( int eventDbid )
{
    return this.raceClassRepo.findByEventDbid( eventDbid )
            .stream()
            .map( raceClassMapper :: mapToDto )
            .collect( Collectors.toList() );
}

그러나 그럼에도 불구하고 항목은 가져옵니다. getEntries ()는 DTO-Mapper에서 호출되어 자동으로 선택 쿼리를 실행하고 항목 컨테이너를 채 웁니다. getClassesEntries () 메서드에 대해서만 PersistentBag의 자동 동기화를 프로그래밍 방식으로 비활성화하는 방법은 무엇입니까?

답변

1 jccampanero Nov 13 2020 at 20:50

프로그래밍 방식으로 관계 해결을 비활성화 할 수 없다고 생각합니다.

더 나은 접근 방식은 매퍼에서 새 메서드를 정의하고 이름을으로 지정하고 mapToDTOWithoutResolvingEntries해당 메서드에서 관계를 해결하지 않는 것입니다.

귀하의 의견에 대해 ModelMapper를 사용하는 경우 특정 사용 사례에서 DTO 의 속성을 건너 뛸 수 있습니다 entries.

다음과 같이 시도하십시오.

public RaceClassDto mapToDTOWithoutResolvingEntries( RaceClass raceClass) {
    return modelMapperWithoutResolvingEntries
      .map ( raceClass, RaceClassDto.class );
}

어디 modelMapperWithoutResolvingEntries동일 modelMapper다음과 함께 이전에 정의 된 mapping추가 :

ModelMapper modelMapperWithoutResolvingEntries = new ModelMapper();
modelMapperWithoutResolvingEntries
    .addMappings(mapper -> mapper.skip(RaceClassDto::setEntries));

TypeMap대신 create a 를 사용할 수 있으며 동일하게 작동해야합니다.

다른 대안이 있습니다. 예를 들어 직접 제공하거나 PropertyMap(관련 javadoc 및 configure메서드 를 덮어 쓰는 방법을 참조하십시오 ) Converter.

1 MAnouti Nov 13 2020 at 20:50

나는 ModelMapper 라이브러리modelMapper 에서 온 것이라고 생각 하므로이 경우이 질문 에서 설명한 대로 항목 매핑을 건너 뛰도록 말할 수 있습니다.

그렇지 않으면 JPA로드 된 객체의 데이터를 느리게 가져온 데이터를 제외한 다른 객체로 복사 할 수 있습니다.