Отображение AbstractEntity на SubClassDTO - стратегия для одной таблицы - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь сопоставить Entity (TrainingEntity) с DTO, где одним из полей является ссылка Set с ManyToMany на AbstractEntity (CoachEntity), разделенная на Single Table на два подкласса: ExternalCoach и InternalCoach.

Оба подкласса имеют разные данные, поэтому требуется два разных преобразователя.

@Entity
@Table(name = "TRAINING")
public class TrainingEntity extends AbstractEntity {

    @ManyToMany()
    @JoinTable(name = "TRAINING_EMPLOYEE", joinColumns = { @JoinColumn(name = "TRAINING_ID") }, inverseJoinColumns = {
            @JoinColumn(name = "COACH_ID") })
    private Set<CoachEntity> coachEntities;

@Column(nullable = false)
private TrainingType trainingType;

......some data....

}

Abstract Coach Entity

    @Entity
    @Table(name = "COACH")
    @DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public abstract class CoachEntity extends AbstractEntity {

 ......some data....

}

Подклассы Coach:

@Entity
@DiscriminatorValue("EXTERNAL")
public class ExternalCoachEntity extends CoachEntity {
 ......some data....
}



@Entity
@DiscriminatorValue("INTERNAL")
public class InternalCoachEntity extends CoachEntity {
 ......some data....
    }

Один преобразователь для AbstractКласс Coach не будет иметь доступа к методам и полям подклассов, поэтому мне нужны два разных для Внешнего и Внутреннего.Чем бы мне пришлось использовать их в классе TrainingMapper, но (пример внутреннего):

public class CustomTrainingMapper {

    public static TrainingDto toTrainingDto(TrainingEntity trainingEntity){
        if(trainingEntity == null){
            return null;
        }

        if(trainingEntity.getTrainingType().equals(TrainingType.INTERNAL)){
            Set<CoachEntity> coachEntities = trainingEntity.getCoachEntities();


            Set<CoachDto> coachDtos = CustomInternalCoachMapper.toDTOSet((Set<InternalCoachEntity>)coachEntities);
        }

Я получаю:

  cannot cast from Set<CoachEntity> to Set<InternalCoachEntity>

Без приведения он просто не видит методы картографов сввод подкласса.

The method toDTOSet(Set<InternalCoachEntity>) in the type CustomInternalCoachMapper is not applicable for the arguments (Set<CoachEntity>)

Когда в mapper я изменяю вход метода на абстрактный класс Coach, он не видит методы и поля подклассов.

Часть InternalMapper:

public class CustomInternalCoachMapper {

    public static CoachDto toCoachDto(InternalCoachEntity coachEntity) {
        if (coachEntity == null) {
            return null;
        }

        EmployeeDto employeeDto = CustomEmployeeMapper.toEmployeeDto(coachEntity.getEmployeeEntity());

        return new InternalCoachDto(coachEntity.getId(), coachEntity.getVersion(), coachEntity.getCreateDate(),
                coachEntity.getUpdateDate(), coachEntity.getName(), coachEntity.getSurname(), employeeDto);
    }

enter image description here

Можно ли отобразить этот набор AbstractEntity в DTO подклассов?Я также пытался использовать AbstractDto для Coach, но затем я столкнулся с той же проблемой, не имея доступа к получателям и установщикам подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...