最初的配置如下:
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多对一的转换,导致转换时会进入死循环。
后改成以下配置:
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;
}
....
}
改成了单向一对多。
这时虽然不会死循环,但由于配置了FetchType.EAGER,导致hibernate在取数据时使用了left outter join把所有数据一起取出来,这样就使得查出来的数据实际上很多是重复的,比如一个单子对应有多个图片的话,就会查出多个重复的数据,网上找了一下,基本上没很好的解决方案好象。
所以最好参照网上的方案,把延迟加载属性加上fetch=FetchType.LAZY,然后在加载order记录时再手工的写代码获取图片的数据,使得hibernate会先把这些数据加载出来,如下,写了一个方法让其它方法再需要强制一对多的数据时调用:
public void initializeGoodPics(Order order) {
order.getOrderGoodPics();
}