#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
список.