我正在开发我的第一个 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 属性将保持加载在内存中,直到应用程序关闭...
提前致谢
乔治
最佳答案
内存要么是一个问题,要么不是。你的内存不足了吗?如果您可以记住所有教师,那么您也可以记住所有组。
否则,如果内存是一个问题,那么您可能需要重新考虑您的设计。
通常使用请求或事务模型。 EntityManager 仅在请求或事务期间存在。在每个事务结束时,都会创建一个新的 EntityManager,或者清除 em。
此外,通常不会保留类的所有实例,而是在需要时查询实例,通常允许用户过滤结果。
如果您想继续使用单个长期存在的 EntityManager,您可以刷新学生(在所有学生查询上设置刷新)以恢复对其组的引用。
关于jpa - eclipselink J2SE fetchType LAZY高效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8027159/