将转换器用于 DTO 时,休眠双向映射结果在循环中

问题描述

我已将类映射如下:

@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 对象都包含一个关联的 Categoryratings 列表

我该如何解决这个问题?也许我在错误的意义上使用双向映射。无论如何,请提供您对此问题的意见和可能的解决方

解决方法

您有 3 个选择。

您可以引入一个上下文并在其构造函数中将对象注册到该上下文。当另一个对象在它的构造函数中时,它可以通过该上下文接收一个飞行列表/对象,从而以这种方式解决循环。

另一种选择是使 DTO 可变并首先实例化对象并将它们注册到上下文中,然后再设置对象的状态。这与第一个解决方案类似,只是 DTO 类不需要了解上下文。

第三个解决方案是通过使用更简单的转换器来避免循环,例如CategoryRating 中的 CategoryItemConverter 仅转换某些数据,而不转换 categoryRatings 列表。