我有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时,我调试并发现该对象实际上是递归引用自身。
这是正常的吗?我不认为这是正常的,但我做错了?
不过,如果我不添加@JsonManagedReference和@JsonBackReference,生成的json也将采用递归格式。 json问题可以通过上面的注释修复,但如何修复返回的对象问题? 我正在使用spring boot data jpa 1.5.6.RELEASE答案 0 :(得分:1)
延迟加载的正确行为。您加载根对象并在序列化期间调用getProducts()。每个产品都试图懒惰地加载PO,这反过来又会加载产品列表等。
要打破此链,请引入DTO(数据传输对象)并将您的实体转换为TDO对象。然后序列化DTO。
有一种替代方式可以解除&#34; unproxy&#34;实体。见here