У меня есть два объекта: «POST» и «TAG» с отношения многие ко многим. Упрощенный пример:
Код: Выделить всё
@Entity
public class Post{
private String title;
@ManyToMany(...)
Set tags;
}
Код: Выделить всё
@Entity
public class Tag{
private String name;
@ManyToMany(...)
Set posts;
Код: Выделить всё
@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
Код: Выделить всё
@Builder
//...
public class TagDTO{
private String name;
Set post;
}
Предположим, у меня есть класс, который сопоставляет сущность Post с PostDTO
Код: Выделить всё
public class mapper{
public PostDTO mapToPostDTO(Post post){
Set tagDTOs = new HashSet();
post.getTags().stream().forEach(tag->tagDTOs.add(mapTotagDTO(Tag)));
return PostDTO.builder()
.title(post.getTitle())
.tags(tagDTOs)
.build();
}
private TagDTO mapToTagDTO(Tag tag){ //Intentionally skip the Set field
return TagDTO.builder()
.name(tag.getName())
.build()
}
Как все это выглядит как опасная практика и может привести к неожиданным результатам, поэтому моя альтернатива — создать базовые DTO, которые не сопоставляться с другими DTO
например
Код: Выделить всё
@Builder
//...
public class SimpleTagDTO{
private String name;
}
Код: Выделить всё
@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
Код: Выделить всё
public class mapper{
public PostDTO mapToPostDTO(Post post){
Set setTags = new HashSet();
post.getTags().stream().forEach(tag->setTags.add(mapToSimpleTagDTO(tag)));
return PostDTO.builder()
.title(post.getTitle())
.tags(setTags)
.build();
}
private SimpleTagDTO mapToSimpleTagDTO(Tag tag){
return SimpleTagDTO.builder()
.name(tag.getName());
}
}
Есть еще одно сообщение, в котором кто-то упоминает использование @JsonBackReference и @JsonManagedReference, но у меня есть опасения, что это свяжет «лидера» отношений (?). Это означает, что я могу отправить postDTO со списком TagDTO, но могут возникнуть проблемы с отправкой TagDTO со списком. PostDTO..?
Любая помощь приветствуется, спасибо
Подробнее здесь: https://stackoverflow.com/questions/793 ... r-my-entit