ModelMapper - 无法将 org.hibernate.collection.internal.PersistentBag 转换为 java.util.ArrayList

Shi*_*abu 8 java hibernate modelmapper

ModelMapper 配置应该是什么样的?

编译组:'org.modelmapper',名称:'modelmapper',版本:'2.3.8'

目前我有:

 modelMapper = new ModelMapper();
            modelMapper.getConfiguration()
                    .setMatchingStrategy(MatchingStrategies.STANDARD)
                    .setFieldMatchingEnabled(true)
                    .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
Run Code Online (Sandbox Code Playgroud)

我的实体有

@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Phones> phones = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我的第二个实体:

@ManyToOne
@JoinColumn(name = "employee_id")
private Employee employee;
Run Code Online (Sandbox Code Playgroud)

我想要的 DTO:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor(force = true)
public class EmployeeDTO {

@Singular
private final List<PhoneDTO> phones;

}
Run Code Online (Sandbox Code Playgroud)

我用这种方式映射:

        EmployeeDTO.EmployeeDTOBuilder employeeDTOBuilder 
= ObjectMapperUtils.map(employee, EmployeeDTO.employeeDTOBuilder.class);
Run Code Online (Sandbox Code Playgroud)

我越来越:

  1. 转换器 org.modelmapper.internal.converter.MergingCollectionConverter@969b4391 无法将 org.hibernate.collection.internal.PersistentBag 转换为 java.util.ArrayList。

ser*_*inc 1

更深入地查看堆栈跟踪:最后一个映射问题通常是更可操作的问题。

也许PhoneDTO是不可映射的?如果是这样,您需要创建一个转换器并告诉模型映射器,如下所示:

public class PhoneConverter extends AbstractConverter<PhoneEntity, PhoneDto>
{
   private final StrictModelMapper strictModelMapper;

   @Override
   public PhoneDto convert(@NonNull final PhoneEntity source)
   {
      PhoneDto phoneDto = new PhoneDto();
      strictModelMapper.map(source, phoneDto);
      return phoneDto;
   }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到modelMapper.