我有一个Customers表,其中有AddressEmbedded

我还有一个硬编码表Countries,其中每个国家都已经有一个区域,国家/地区是主键。

我想加入AddressEmbeddedCountries,所以我使用了ManyToOne并将CountryEntity放在AddressEmbedded中。

但是我收到一个错误,认为mapstruct无法生成setCountry

所以问题是,我该怎么做AddressEmbedded.setCountry(string country)
应该调用数据库以获取该国家/地区的相应区域,但是在setter中添加数据库调用似乎是错误的。

以下是实体定义:

    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    @Data
    @Embeddable
    public class AddressEmbedded {

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "country")
        private CountryEntity country;
    }


    @Data
    @Entity
    @Table(name = "Countries")
    public class CountryEntity {

        @Id
        @Column(name = "country")
        private String country;

        @Column(name = "region")
        private String region;
    }


    @Data
    @Entity
    @Table(name = "Customers")
    public class CustomerEntity {
        @Embedded
        private AddressEmbedded address;
    }

最佳答案

这是通过mapstruct映射解决的

    @Mappings(
            @Mapping(target = "address.country", source = "countryEntity")
    )
    CustomerEntity fromSubmitCustomerDetailsRequestToCustomerEntity(SubmitCustomerDetailsRequest request, CountryEntity countryEntity);

    @Mappings(
            @Mapping(target = "address.country", source = "customerEntity.address.country.country")
    )
    GetCustomerDetailsResponse fromCustomerEntityToGetCustomerDetailsResponse(CustomerEntity customerEntity);


我在CountryEntity中有fromSubmitCustomerDetailsRequestToCustomerEntity,因为在我调用它之前,我先确认我已经存在一个国家。

10-01 06:34