为什么JPA OneToMany映射findAll方法返回递归对象?

时间:2017-08-15 09:13:36

标签: java spring jpa recursion spring-boot

我有2个域类,PO类和Product Class,并且PO类中有一个List。所以产品很多都是PO,而PO是OneToMany到产品。

public class PO {
    ....

    @OneToMany(mappedBy = "po", cascade= CascadeType.ALL, orphanRemoval=true)
    private List<Product> products = new ArrayList<>();
    .....
}

public class Product {
    ....
    @ManyToOne(optional = false)
    @JoinColumn(name = "po_id")
    private PO po;
    ....
}

构建po对象时。我在产品中设置po字段,参考po。

PO repo = new PO();
....
for (StockLine item: source.getStockLines()) {
    Product prod = new Product();
    ....
    prod.setPo(repo);
    repo.getProducts().add(prod);
}

当我调用它PORepo.save(po);时,外键被填充,两个表中的所有数据都是正确的。

但问题是当我使用PORepo.findAll()获取PO时,我调试并发现该对象实际上是递归引用自身。

enter image description here

这是正常的吗?我不认为这是正常的,但我做错了?

不过,如果我不添加@JsonManagedReference和@JsonBackReference,生成的json也将采用递归格式。 json问题可以通过上面的注释修复,但如何修复返回的对象问题? 我正在使用spring boot data jpa 1.5.6.RELEASE

1 个答案:

答案 0 :(得分:1)

延迟加载的正确行为。您加载根对象并在序列化期间调用getProducts()。每个产品都试图懒惰地加载PO,这反过来又会加载产品列表等。

要打破此链,请引入DTO(数据传输对象)并将您的实体转换为TDO对象。然后序列化DTO。

有一种替代方式可以解除&#34; unproxy&#34;实体。见here