2011-11-06 33 views
2

我正在開發我的第一個EclipseLink J2SE項目,並且懷疑是否有一種有效的方式來利用延遲加載,即使在訪問對象後也是如此。eclipselink J2SE fetchType LAZY高效使用

下面是一個例子來說明問題。假設我們有這2個實體:

@Entity 
public class Group { 
long id; 

@ManyToOne 
Teacher teacher; 

//getters & setters 
} 



@Entity 
public class Teacher { 
long id; 

@OneToMany(mappedBy="teacher", fetch=FetchType.LAZY) 
List<Group> groups; 

//getters & setters 
} 

要裝入教師的列表(其將表格組件上示出),我使用的是靜態方法從CLASSE稱爲MyPersistenceManager :

public static List<Teacher> loadTeachers(){ 
    Query q=getEM().createQuery("select t from teacher t"); 
    return (List<Teacher>)q.getResultList(); 
} 

然後返回的列表將被引用爲TableModel的一個屬性。

現在假設我們要加載每次correponding到選定的教師羣體的列表中選擇更改(有調用的getter將做的工作在這裏沒問題),(這裏是我的問題),以保留內存,當相應的教師被取消選擇時,清理分配給這些組的內存。有沒有辦法做到這一點?

注意:我上面提到的項目是一個J2SE項目,它的目的是在本地使用嵌入式數據庫(沒有許多客戶端的網絡)。我正在使用一個長壽命的持久化上下文(EM),並將「eclipselink.persistence-context.reference-mode」屬性設置爲「WEAK」,將「shared-cache-mode」設置爲NONE以禁用第二個緩存級別(在我的情況下無效)。還有一件事,你可以說我不必擔心WEAK模式下的內存問題,但事實是WEAK模式不會觸及引用的實體,在我的情況下,教師列表被引用,因此每個組屬性,它被訪問的內存將保持加載,直到應用程序被關閉......

由於提前
喬治

回答

3

無論是內存是一個問題,或者不是。你內存不足了嗎?如果你可以讓所有老師記憶,那麼你也可以擁有所有的小組。

否則,如果內存是一個問題,那麼你可能想重新考慮你的設計。

通常使用請求或事務模型。一個EntityManager只會在請求或事務期間存活。在每個事務結束時,創建一個新的EntityManager,或者清除em。

此外,並非保留所有類的實例,通常在需要時查詢實例,通常允許用戶過濾結果。

如果您不想繼續使用一個長期存在的EntityManager,可以刷新學生(在所有學生查詢中設置刷新)以恢復對其組的引用。

+0

「那麼你也可以擁有所有的團體。」老師組的例子只是一個簡單的例子來說明我的問題,而沒有輸入細節,所以......是的,記憶是我的項目的關注。現在關於單個/多個EM,我做了一個公平的研究,並在一些論壇上詢問了它(包括stackOverFlow [link](http://stackoverflow.com/questions/7491761/jpa-on-a-desktop-swing-application )),並最終做出了唯一的選擇。 –

+0

刷新建議似乎是一個好主意,但有些事情讓我感到困惑。經過一些測試(使用我的J2SE環境和我的嵌入式數據庫)後,我發現延遲加載運行不正常。這是查詢教師名單後,我分離(通過EntityManageImpl.detach()的意思)每個老師沒有訪問groups屬性。現在groups屬性應該是空的,因爲老師在訪問它之前已經被分離了......並且驚喜組被加載到內存中,我可以顯示它的所有元素!這與嵌入式數據庫有什麼關係? –

+0

我甚至在getResultList()指令後面關閉了EM和EMFactory,並且這些組仍然可以訪問!我 - 我想知道延遲加載? :( –