1. 程式人生 > >org.hibernate.LazyInitializationException: failed to lazily initialize a collection..的解決方案

org.hibernate.LazyInitializationException: failed to lazily initialize a collection..的解決方案

使用hibernate從一方獲取多方資訊的時候發生:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.haowei.carmanager.model。。。。

從網上搜一下大致跟hibernate載入關聯物件的方式有關,一個是懶載入方式,一個是立即載入方式。
原先配置是:

一方中的多方:

@OneToMany(mappedBy = "carFirm",cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    private
Set<CarBrandType> brandTypeSet; //汽車廠商與汽車品牌為一對多的關係

多方中的一方:

@ManyToOne(cascade = CascadeType.ALL,optional = false)
    @JoinColumn(name="brandid",referencedColumnName = "carfirm_id")
    private CarFirm carFirm;             //汽車廠商與汽車品牌為一對多的關係

注意在多方中的一方的配置沒有指定載入方式,而且一方中的多方是懶載入,因此在獲取一方的時候一方是獲取到了,但是再獲取多方的時候session已經關閉了,這時候會獲取不到多方資訊,因此報錯。
解決方式:
一方中的多方:

@OneToMany(mappedBy = "carFirm",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<CarBrandType> brandTypeSet;    //汽車廠商與汽車品牌為一對多的關係

多方中的一方:

@ManyToOne(cascade = CascadeType.ALL,optional = false,fetch = FetchType.LAZY)
    @JoinColumn(name="brandid",referencedColumnName = "carfirm_id"
) private CarFirm carFirm; //汽車廠商與汽車品牌為一對多的關係

就是將一方中的多方的載入方式改為立刻載入,而多方中的一方改為懶載入即可。至於多方中的一方的載入方式是不是也跟該異常有關,這裡就不實驗了。