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

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как управлять циклической зависимостью при создании 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 ... -my-entity
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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