Eu pesquisei muito e É realmente bizarro que a Primavera de inicialização (versão mais recente) pode não ter o carregamento lento não está funcionando. Abaixo estão pedaços do meu código:
Meu recurso:
public ResponseEntity<Page<AirWaybill>> searchAirWaybill(CriteraDto criteriaDto, @PageableDefault(size = 10) Pageable pageable{
airWaybillService.searchAirWaybill(criteriaDto, pageable);
return ResponseEntity.ok().body(result);
}
Meu serviço:
@Service
@Transactional
public class AirWaybillService {
//Methods
public Page<AirWaybill> searchAirWaybill(AirWaybillCriteriaDto searchCriteria, Pageable pageable){
//Construct the specification
return airWaybillRepository.findAll(spec, pageable);
}
}
Meu Entidade:
@Entity
@Table(name = "TRACKING_AIR_WAYBILL")
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@airWaybillId") //to fix Infinite recursion with LoadedAirWaybill class
public class AirWaybill{
//Some attributes
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FK_TRACKING_CORPORATE_BRANCH_ID")
private CorporateBranch corporateBranch;
}
E quando a depuração, eu ainda obter todas preguiçoso carregado atribuiu carregado. Veja a imagem abaixo.
Uma das minhas perguntas é poderiam Jackson estar envolvido em tal comportamento? Existe alguma maneira que eu possa ter perdido para ativar o carregamento lento?
EDITAR
Outra questão, poderia o depurador estar envolvido em arruinar o carregamento lento?
EDIT 2:
Para especificação de construção, eu tenho:
public static Specification<AirWaybill> isBranchAirWayBill(long id){
return new Specification<AirWaybill>() {
@Override
public Predicate toPredicate(Root<AirWaybill> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.equal(root.join("corporateBranch",JoinType.LEFT).get("id"),id);
}
};
}
Hibernação Sessão existe dentro de método com @Transactional
. Passando entidade externa Classe de serviço é uma prática ruim porque sessão está sendo fechado depois de deixar o seu search
método. Por outro lado a sua entidade contém preguiçosos coleções inicializados, que não pode ser puxado uma vez sessão é fechada.
A boa prática é mapear entidade para objeto de transporte e devolver esses objectos de transporte de serviço (não entidades matérias).