【发布时间】:2011-11-06 13:05:20
【问题描述】:
我正在开发我的第一个 EclipseLink J2SE 项目,并且想知道是否有一种有效的方法可以在访问对象之后利用延迟加载。
这里有一个例子来说明这个问题。假设我们有这两个实体:
@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
}
为了加载教师列表(将显示在 JTable 组件上),我使用了一个名为 MyPersistenceManager 的类中的静态方法:
public static List<Teacher> loadTeachers(){
Query q=getEM().createQuery("select t from teacher t");
return (List<Teacher>)q.getResultList();
}
然后返回的列表将被引用为 TableModel 的一个属性。
现在假设我们要在每次选择更改时加载与所选教师相对应的组列表(这里调用 getter 没有问题),和(这是我的问题) 为了保留内存,请在取消选择相应的教师时清理分配给这些组的内存。有什么办法吗?
注意: 我上面提到的项目是一个 J2SE 项目,旨在与嵌入式数据库一起在本地使用(没有许多客户端的网络)。我正在使用长寿命的持久性上下文 (EM),将“eclipselink.persistence-context.reference-mode”属性设置为“WEAK”,并将“shared-cache-mode”设置为 NONE 以停用第二个缓存级别(在我的情况下没用)。还有一件事,你可能会说我不必担心 WEAK 模式的内存问题,但事实是 WEAK 模式不会触及被引用的实体,在我的例子中,教师列表是被引用的,所以每个被访问的 groups 属性将一直加载在内存中,直到应用程序关闭...
提前致谢
乔治
【问题讨论】:
标签: jpa lazy-loading eclipselink