Animal. java
@Data
@Entity
public class Animal implements MyEntityInterface {
public enum Sex {MALE, FEMALE}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private Sex sex;
private boolean castrated;
@OneToMany
private List<Symptom> symptoms;
}
AnimalDTO. java
@Getter
@Setter
public class AnimalDTO implements Serializable {
private long id;
private String name;
private Animal.Sex sex;
private boolean castrated;
private List<Long> symptoms;
}
I wi sh для списка симптомов, которые будут автоматически сопоставлены со списком идентификаторов , Этого можно достичь разными способами, например, путем создания TypeMap, создания Converter или даже просто путем создания метода в AnimalDTO. java:
public void setSymptoms(List<Symptom> symptoms) {
if (symptoms != null)
this.symptoms = symptoms.stream().map(s -> s.getId()).collect(Collectors.toList());
}
Но теперь представьте, что это не только симптомы, но и другие поля тоже. Это много кода для той же функциональности. И потом, это не только Animal to AnimalDTO, но и еще 30 различных классов с соответствующими DTO.
Кроме того, этот путь остается открытым. От ID к сущности. Это (теоретически) может быть легко достигнуто с помощью следующего псевдокода:
List<EntityMemberField.class> list;
for (var entityid : listOfEntityIDsOfDto) {
Object persistedObject = entityManager.find(EntityMemberField.class, entityid);
list.add(persistedObject);
}
...
ModelMapperDestination.setField(list);
Это то же самое для абсолютно всех сущностей / DTO и должно автоматически происходить для всех отношений сущностей, где сущность реализует MyEntityInterface.
Идея, как мне этого добиться, заключается в переопределении MappingEngineImpl. java из ModelMapper, который я регистрирую в качестве Spring Service и внедряю EntityManager, но как я могу заставить ModelMapper использовать мой? Или, может быть, есть более простой способ?
Цель состоит в том, чтобы сделать довольно автоматизированное преобразование из сущностей Spring в соответствующие им DTO ... просто позвонив modelMapper.map(entity, EntityDTO.class);