記一次hibernate一對多問題的解決

最初的配置以下: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();
	}
相關文章
相關標籤/搜索