@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Portfolio {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@OneToMany(mappedBy="parent" ,fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private Set<PortfolioChildMap> parents;
}
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PortfolioChildMap {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@ManyToOne
@JsonBackReference
@JoinColumn(name = "parent_id")
private Portfolio parent;
@ManyToOne
@JoinColumn(name = "child_id")
private Portfolio child;
}
@Data
@Builder
public class PortfolioResponseDto {
private Integer id;
private List<PortfolioResponseDto> children;
public static PortfolioResponseDto toDTO(Portfolio entity) {
return PortfolioResponseDto.builder()
.id(entity.getId())
.children(entity.getParents().stream().map(parent-> toDTO(parent.getChild())).collect(Collectors.toList()))
.build();
}
}
public class PortfolioService {
private final PortfolioRepository portfolioRepository;
@Override
public List<PortfolioResponseDto> getAllPortfolios() {
return portfolioRepository.findAll().stream()
.map(PortfolioResponseDto::toDTO).collect(Collectors.toList());
}
}
表 portfolio_child_map
如您所见,id 为 33 和 34 的投资组合之间有一个圆圈。 父 Portfolio.id=33 有子 Portfolio.id=34 并且 父 Portfolio.id=34 有子 Portfolio.id=33,这是一个圆圈
当我调用 PortfolioService.getAllPortfolios() 时,它会在 PortfolioResponseDto.toDTO 方法中引发错误。
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause java.lang.StackOverflowError: null
我很确定这是常见错误,但我不知道如何纠正它。所以我有两个问题:
此问题的正确解决方法是什么,如何避免此类错误。
就我而言,我可以从父母那里得到第一个孩子并停止。我不知道该怎么做。我应该在存储库中实现自定义 findAll 方法吗?
从根本上来说,这不是实体映射所固有的。这只是无限递归的情况。这意味着您必须防止无限递归的发生。有几个选项...您可以...