Если вы использовали JPA, вы, вероятно, столкнулись с классическим
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: class, could not initialize proxy - no Session
. Я использую ModelMapper, чтобы отобразить мои спящие объекты в DTO, и, конечно, я сталкиваюсь с этой проблемой.,Первоначально, до этого момента, все было установлено на EAGER, но я быстро понял, что это НЕ решение, поскольку теперь все ОЧЕНЬ медленно загружается.Итак, теперь я вернулся к настройке LAZY
.
Итак, мой вопрос: есть ли способ настроить ModelMapper
, чтобы он мог проверять, является ли поле ленивым перед отображением / и если оно ленивое, не отображать его?
Я проводил здесь некоторые исследования пользовательских отображений http://modelmapper.org/user-manual/property-mapping/
, но я не могу найти способ добавить какую-то логику.
Я нашел решение здесь , но это для Dozer
EDIT:
Я использую Spring Boot JPA.Вот мой код:
@Data
@Entity
@Table(name = "vm_request")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class VirtualMachineRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// removed other properties
@OneToMany(mappedBy = "request", cascade = CascadeType.ALL, orphanRemoval = true)
@ToString.Exclude
@EqualsAndHashCode.Exclude
private Set<VirtualMachine> virtualMachines;
}
Я сопоставляю этот объект с DTO:
@Data
public class VirtualMachineRequestDTO {
private Long id;
// removed other properties
private Set<VirtualMachineDTO> virtualMachines;
}
, используя ModelMapper
как таковой:
public VirtualMachineRequestDTO convertToDTO(VirtualMachineRequest request) {
VirtualMachineRequestDTO requestDTO = mapper.map(request, VirtualMachineRequestDTO.class);
return requestDTO;
}
Моя проблема в том, что, поскольку набор virtualMachines
по умолчанию Lazy
(и это предназначено для определенных ситуаций), ModelMapper
встречает исключение LazyInitializationException
Я пытаюсь найти способиметь ModelMapper
игнорировать поле, если оно ленивое и не было инициализировано.