Я пытаюсь сопоставить 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);
}
Можно ли отобразить этот набор AbstractEntity в DTO подклассов?Я также пытался использовать AbstractDto для Coach, но затем я столкнулся с той же проблемой, не имея доступа к получателям и установщикам подклассов.