我有一个Customers
表,其中有AddressEmbedded
。
我还有一个硬编码表Countries
,其中每个国家都已经有一个区域,国家/地区是主键。
我想加入AddressEmbedded
和Countries
,所以我使用了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
,因为在我调用它之前,我先确认我已经存在一个国家。