2017-08-15 98 views
2

我有2个域类,PO类和产品类,并且PO类中有一个列表。所以产品是ManytoOne到PO,PO是OneToMany到产品。为什么JPA OneToMany映射findAll方法返回递归对象?

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中引用了Product中的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问题可以通过上面的注解来解决,但是如何解决返回的对象问题? 我使用的弹簧引导数据JPA 1.5.6.RELEASE

+0

什么是'POProduct'? – Andrew

+0

您在PO类中的列表是类型为“POProduct”而不是“Product”的类型? '私人列表产品=新的ArrayList <>();' –

+0

抱歉,这是错字,当我编辑的问题,它应该是产品。我已纠正它。 – actan

回答

1

它是延迟加载正确的行为。加载根对象并在序列化过程中调用getProducts()。每个产品的尝试lazyly负载PO,这反过来负载产品等

为了打破这个链条引入DTO(数据传输对象)和转换您的实体TDO对象名单。然后序列化DTO。

有一种替代的方法来“unproxy”实体。请参阅here

+0

我尝试了急切的加载,结果是一样的。所以它与'延迟加载'无关? – actan