2012-05-24 33 views
4

我有設定的模型在我的應用程序的用戶實體,其定義如下:LazyInitializationException中在播放框架使用ElementCollection時

public class User extends Model { 

    private String name; 

    private byte[] sk; 

    @Column(columnDefinition = "BINARY(272)") 
    private byte[] pk; 

    private int port; 

    @OneToOne 
    public Profile profile; 

    @ElementCollection 
    public List<String> friends; 

    @ElementCollection 
     public List<String> mirrors; 
... 
} 

並且在我的申請(控制器類)的不同部分的方法我檢索,並試圖修改如下鏡像列表:

User u = User.connect(username); 
    int port = ProfileFinder.getLocation(username, mirror); 
    u.mirrors.remove(mirror); 
    u.save(); 

這是拋出一個錯誤,指出:

LazyInitializationException occured : failed to lazily initialize a collection of role: models.User.mirrors, no session or session was closed 

我懷疑這是由於我誤解了@ElementCollection標籤的某些元素,但任何人都可以澄清我如何糾正這個問題?

謝謝。

回答

7

默認情況下,XxxToMany關聯和元素集合被延遲加載。

這意味着只有在需要調用某個收集方法時才從數據庫加載收集元素。但是,當然,這個實體需要被附加到它的會話中才能工作。如果會話關閉,則拋出異常。

您可以通過設置註釋的fetch屬性來進行加載,也可以在事務中使用初始化集合的查詢或服務,然後再返回它。請注意,如果您將其加載,即使您不需要收集元素,它也會始終處於急切加載狀態。

0

是的,你應該使用EAGER註釋,但要小心,因爲正如JB Nizet所說,這些元素總是會被加載。

0

如果您不想從延遲加載更改爲渴望,您可以選擇另一個選項:合併。

User u = User.connect(username); 
u.merge(); 

合併將採取與會話斷開連接並重新連接的對象。例如,如果緩存一個對象(本例中爲用戶的一個實例),則無需先在對象上使用.merge(),就無法檢索用戶對象的鏡像。