Автоматическое преобразование Spring JPA Entity OneToMany в список <ID>в DTO и обратно (ModelMapper) - PullRequest
0 голосов
/ 23 марта 2020

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);

...