我需要将dto的倍数映射到实体。几乎所有这些对象都引用了另一个,并且我不知道在映射dto时如何传递引用。
这里是地址的一种业务实现:
addressRepository.saveAll(dtos.stream()
.map(addressMapper::asEntity)
.collect(Collectors.toList())).stream()
.map(addressMapper::asDto)
.collect(Collectors.toList());
这里是映射器
@Mappings({
@Mapping(target="streetName", source="streetName"),
@Mapping(target="streetNumber", source="streetNumber"),
@Mapping(target="block", source="block"),
@Mapping(target="floor", source="floor")
})
CsvBusinessData asDto(AddressEntity address);
@InheritInverseConfiguration
AddressEntity asAddressEntity(CsvBusinessData address);
所有实现者都从相同的dto读取,然后将它们映射到dto和entite。
这里是给客户的体现:
customerRepository.saveAll(dtos.stream()
.map( csvMapper::asCustomerEntity)
.collect(Collectors.toList())).stream()
.map(customerMapper::asDto)
.collect(Collectors.toList());
还有我要引用的映射到映射的地址实体(我的客户实体具有一个地址类型字段)。
@Mappings({
@Mapping(target = "nom", source = "lastName"),
@Mapping(target = "nd", source = "accountNumber"),
@Mapping(target = "logo", source = "logo"),
@Mapping(target = "address", source = "address"
)
})
CsvBusinessData asDto(CustomerEntity customer);
@InheritInverseConfiguration
CustomerEntity asCustomerEntity(CsvBusinessData customer);
非常感谢。
首先,您不必为具有相同名称的字段进行映射,MapStruct会为您完成。例如,块-块。1)您的对象相关:您可以对相关对象使用“使用”功能。
@Mapper(uses = {AddressMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CustomerMapper {
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo") //don't needed as same name, delete it
@Mapping(target = "address", source = "address") //don't needed as same name, delete it
CsvBusinessData asDto(CustomerEntity customer);
@InheritInverseConfiguration
CustomerEntity asCustomerEntity(CsvBusinessData customer);
}
@Mapper( unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CustomerMapper {
@Mapping(target="streetName", source="streetName") //don't needed as same name, delete it
@Mapping(target="streetNumber", source="streetNumber") //don't needed as same name, delete it
@Mapping(target="block", source="block") //don't needed as same name, delete it
@Mapping(target="floor", source="floor") //don't needed as same name, delete it
CsvBusinessData asDto(AddressEntity address);
}
2)您的对象不相关:您可以通过传递少量对象作为参数来解决您的问题。但是,那么您必须有自己的相反方向方法。如果您在AddressEntity和CustomerEntity中具有相同的字段名称,则只需将其指定为address.streetName或customer.lastName
@Mapping(target="streetName", source="streetName")//possibly don't needed as same name
@Mapping(target="streetNumber", source="streetNumber")//possibly don't needed as same name
@Mapping(target="block", source="block")//possibly don't needed as same name
@Mapping(target="floor", source="floor")//possibly don't needed as same name
@Mapping(target = "nom", source = "lastName")
@Mapping(target = "nd", source = "accountNumber")
@Mapping(target = "logo", source = "logo")//possibly don't needed as same name
@Mapping(target = "address", source = "customer.address") //specified as you have parameter address
CsvBusinessData asDto(AddressEntity address, CustomerEntity customer);
@Mapping(target="streetName", source="streetName")//possibly don't needed as same name
@Mapping(target="streetNumber", source="streetNumber")//possibly don't needed as same name
@Mapping(target="block", source="block")//possibly don't needed as same name
@Mapping(target="floor", source="floor")//possibly don't needed as same name
AddressEntity asAddressEntity(CsvBusinessData businessData);
@Mapping(source = "nom", target = "lastName")
@Mapping(source = "nd", target = "accountNumber")
@Mapping(source = "logo", target = "logo")//possibly don't needed as same name
@Mapping(source = "address", target = "address") //specified as you have parameter address
CustomerEntity asCustomerEntity(CsvBusinessData businessData);