eclipselink J2SE fetchType LAZY高效使用

时间:2011-11-06 13:05:21

标签: jpa lazy-loading eclipselink

我正在开发我的第一个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的classe中的静态方法:

 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属性将保持加载到内存中,直到应用程序关闭...

先谢谢你 乔治

1 个答案:

答案 0 :(得分:3)

内存是一个问题,或者不是。你的内存不足吗?如果您可以将所有教师都安排在内存中,那么您也可以拥有所有组。

否则,如果关注内存,那么您可能需要重新考虑设计。

通常使用请求或事务模型。 EntityManager仅在请求或事务期间存在。在每个事务结束时,将创建一个新的EntityManager,或者清除em。

此外,不是保留类的所有实例,而是在需要时通常查询实例,通常允许用户过滤结果。

如果您想继续使用单个长期存在的EntityManager,则可以刷新学生(在所有学生查询上设置刷新)以恢复对其组的引用。