MapStruct: Как использовать mapper для сопоставления объектов View с составным ключом JPA? - PullRequest
0 голосов
/ 22 января 2020

У меня есть целевая сущность, например:

public class ApplicationUsage {
    @Id
    private ApplicationUsagePK appUsage;    //Guid  No documentation available.
    private String name;
    .
    .
    public ApplicationUsage(String id, Integer compId) {
       this.appUsage = new ApplicationUsagePK(id, compId); //This is present in ApplicationUsagePK initiated here which acts are composite key
    }

Исходный объект выглядит следующим образом:

public class ApplicationUsage {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("name")
    @Expose
    private String name;

Мне нужно сопоставить идентификатор исходного объекта с applicationUsage (String id , а CompID исходит из какой-то другой переменной, и он должен отображаться с applicationUsage (.., Integer compId)

Какие изменения необходимы в вышеуказанном классе или преобразователе для достижения То же самое?

Ниже приведен текущий картограф:

@Mapper
public interface ApplicationUsageMapper {
    ApplicationUsageMapper MAPPER = Mappers.getMapper( ApplicationUsageMapper.class );

    ApplicationUsage entityToDao(com.inte.meow.vo.computer.ApplicationUsage source);
}

Плохой способ:

Я использовал неверный способ исправить это, что вы можете понять, глядя на следующее:

ApplicationUsage aUsage = ApplicationUsageMapper.MAPPER.entityToDao(agreement.getBody());
aUsage.initiateApplicationUsage(agreement.getBody().getId(), compId);

1 Ответ

0 голосов
/ 05 февраля 2020

Вы можете сделать это, используя @Context аннотацию

@Mapper
public interface ApplicationUsageMapper {
    ApplicationUsageMapper MAPPER = Mappers.getMapper( ApplicationUsageMapper.class );

    @Mapping(target = "appUsage", source = "source", qualifiedByName = "getAppUsage")
    ApplicationUsage entityToDao(com.inte.meow.vo.computer.ApplicationUsage source, @Context Integer compId);

    @Named("getAppUsage")
    default ApplicationUsagePK toAppUsage(com.inte.meow.vo.computer.ApplicationUsage source, @Context Integer compId) {
        return new ApplicationUsagePK (source.getId(), compId));
    }
}
...