Ich habe zwei Entitäten, „POST“ und „TAG“ mit einem Viele-zu-viele-Beziehung. Vereinfachtes Beispiel:
Code: Select all
@Entity
public class Post{
private String title;
@ManyToMany(...)
Set tags;
}
Code: Select all
@Entity
public class Tag{
private String name;
@ManyToMany(...)
Set posts;
Code: Select all
@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
Code: Select all
@Builder
//...
public class TagDTO{
private String name;
Set post;
}
Sagen wir, ich habe eine Klasse, die eine Post-Entität einem PostDTO zuordnet
Code: Select all
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()
}
Wie all dies wie eine gefährliche Praxis aussieht und zu unerwarteten Ergebnissen führen kann, daher besteht meine Alternative darin, einfache DTOs zu erstellen nicht anderen DTOs zuordnen
zum Beispiel
Code: Select all
@Builder
//...
public class SimpleTagDTO{
private String name;
}
Code: Select all
@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
Code: Select all
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());
}
}
Es gibt einen anderen Beitrag, in dem jemand die Verwendung von @JsonBackReference erwähnt @JsonManagedReference, aber dann habe ich Angst, dass dadurch der „Anführer“ der Beziehung gebunden wird (?). Das heißt, ich kann ein PostDTO mit einer Liste von TagDTOs senden, aber möglicherweise Probleme beim Senden von TagDTOs mit einer Liste von PostDTOs..?
Jede Hilfe ist willkommen, danke