Spring Boot – как управлять циклической зависимостью при создании DTO для моей сущностиJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring Boot – как управлять циклической зависимостью при создании DTO для моей сущности

Сообщение Anonymous »

Я работаю над приложением Spring Boot и пытаюсь отправить ответ от моего контроллера.
У меня есть два объекта: «POST» и «TAG» с отношения многие ко многим. Упрощенный пример:

Код: Выделить всё

@Entity
public class Post{
private String title;

@ManyToMany(...)
Set tags;
}
и

Код: Выделить всё

@Entity
public class Tag{
private String name;

@ManyToMany(...)
Set posts;
Предположим, я создаю классы DTO для этих двух

Код: Выделить всё

@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;
}
Обновлен PostDTO

Код: Выделить всё

@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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»