Двунаправленное отображение в режиме гибернации приводит к циклу при использовании конвертера для DTO

#java #hibernate #jpa #java-ee-6

#java #гибернация #jpa #java-ee-6

Вопрос:

Я сопоставил классы следующим образом:

 @ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "CATEGORY_ITEMS_ID")
private CategoryItem categoryItem;

@OneToMany(mappedBy="categoryItem",cascade = CascadeType.ALL, orphanRemoval = true)
private List<CategoryRating> categoryRatingList;
 

Но когда мне нужно преобразовать табличные модели в dto, я попадаю в цикл как:

  target.setCategoryRatingDtoList(categoryRatingConverter.convert(source.getCategoryRatingList()));

 target.setCategoryItemDto(categoryItemConverter.convertToDto(source.getCategoryItem()));
 

оба конвертера в конечном итоге вызывают друг друга.

Мне нужен результат как:

Список CategoryItems, в котором каждый объект CategoryItems содержит список связанных категорий

Как мне решить эту проблему? Возможно, я использую двунаправленное отображение в неправильном смысле. В любом случае, пожалуйста, сообщите свое мнение и возможные решения этой проблемы

Ответ №1:

У вас есть 3 варианта.

Вы можете ввести контекст и зарегистрировать объекты в этом контексте в их конструкторах. Когда другой объект находится в его конструкторе, он может получать список / объект inflight через этот контекст и, таким образом, разрешать цикл таким образом.

Другой вариант — сделать DTO изменяемыми и сначала создать экземпляр объектов, а также зарегистрировать их в контексте, прежде чем устанавливать состояние для объектов. Это похоже на первое решение с той небольшой разницей, что классу DTO не нужно знать о контексте.

Третье решение заключается в том, что вы избегаете цикла, используя более простой конвертер, например CategoryRating , внутри CategoryItemConverter , который преобразует только некоторые данные, но не categoryRatings список.