我正在開發我的第一個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模式不會觸及引用的實體,在我的情況下,教師列表被引用,因此每個組屬性,它被訪問的內存將保持加載,直到應用程序被關閉......
由於提前
喬治
「那麼你也可以擁有所有的團體。」老師組的例子只是一個簡單的例子來說明我的問題,而沒有輸入細節,所以......是的,記憶是我的項目的關注。現在關於單個/多個EM,我做了一個公平的研究,並在一些論壇上詢問了它(包括stackOverFlow [link](http://stackoverflow.com/questions/7491761/jpa-on-a-desktop-swing-application )),並最終做出了唯一的選擇。 –
刷新建議似乎是一個好主意,但有些事情讓我感到困惑。經過一些測試(使用我的J2SE環境和我的嵌入式數據庫)後,我發現延遲加載運行不正常。這是查詢教師名單後,我分離(通過EntityManageImpl.detach()的意思)每個老師沒有訪問groups屬性。現在groups屬性應該是空的,因爲老師在訪問它之前已經被分離了......並且驚喜組被加載到內存中,我可以顯示它的所有元素!這與嵌入式數據庫有什麼關係? –
我甚至在getResultList()指令後面關閉了EM和EMFactory,並且這些組仍然可以訪問!我 - 我想知道延遲加載? :( –