【问题标题】:eclipselink J2SE fetchType LAZY efficient useeclipselink J2SE fetchType LAZY 高效使用
【发布时间】: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


    【解决方案1】:

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

    否则,如果内存是一个问题,那么您可能需要重新考虑您的设计。

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

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

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

    【讨论】:

    • "那么您可能也可以拥有所有组。"教师组的例子只是一个简化的例子来说明我的问题,没有输入细节,所以......是的,记忆是我项目的一个问题。现在关于单/多 EM,我做了一个公平的研究,并在一些论坛(包括 stackOverFlow link)上询问了它,最终做出了单 em 的选择。
    • 刷新建议似乎是个好主意,但有些东西让我感到困惑。经过一些测试(使用我的 J2SE 环境和我的嵌入式数据库),我发现延迟加载运行不正常。那是在查询教师列表之后,我在不访问组属性的情况下分离(通过 EntityManageImpl.detach())每个教师。现在,groups 属性应该是空的,因为在访问之前已经分离了老师...并且惊喜组已加载到内存中,我可以显示它的所有元素!这和嵌入式数据库有什么关系吗?
    • 我什至在 getResultList() 指令之后关闭了 EM 和 EMFactory,仍然可以访问这些组!我错过了延迟加载吗? :(
    • 关于延迟加载here的confision是答案。 “否则,如果内存是一个问题,那么您可能需要重新考虑您的设计。”,感谢您的提示,我确实重新考虑了我的设计,here 是我将采用的新设计:)
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2016-12-10
    • 2022-11-11
    相关资源
    最近更新 更多