最初的配置以下:java
public class Order extends BaseEntity { ... @OneToMany(cascade=CascadeType.ALL,mappedBy="order", fetch = FetchType.EAGER) public Set<OrderGoodsPic> getOrderGoodPics() { return orderGoodPics; } } public class OrderGoodsPic extends BaseEntity { @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name="order_id") public Order getOrder() { return order; } }
同事配置了又向一对多的关系,由于这个表的数据要传给客户端,之间经过json,使用了com.fasterxml.jackson这个jar包,在解析时由于没有忽略对OrderGoodsPic多对一的转换,致使转换时会进入死循环。json
后改为如下配置:app
public class Order extends BaseEntity { 。。。 @OneToMany(cascade=CascadeType.REMOVE,fetch=FetchType.EAGER) @JoinColumn(name="order_id") public Set<OrderGoodsPic> getOrderGoodPics() { return orderGoodPics; } 。。。 } public class OrderGoodsPic extends BaseEntity { ... @Column(name="order_id", length=32) public String getOrderId() { return this.orderId; } .... }
改为了单向一对多。fetch
这时虽然不会死循环,但因为配置了FetchType.EAGER,致使hibernate在取数据时使用了left outter join把全部数据一块儿取出来,这样就使得查出来的数据实际上不少是重复的,好比一个单子对应有多个图片的话,就会查出多个重复的数据,网上找了一下,基本上没很好的解决方案好象。this
因此最好参照网上的方案,把延迟加载属性加上fetch=FetchType.LAZY,而后在加载order记录时再手工的写代码获取图片的数据,使得hibernate会先把这些数据加载出来,以下,写了一个方法让其它方法再须要强制一对多的数据时调用:spa
public void initializeGoodPics(Order order) { order.getOrderGoodPics(); }