【问题标题】:Lazy loading JPA entities in a desktop application在桌面应用程序中延迟加载 JPA 实体
【发布时间】:2015-02-14 08:52:42
【问题描述】:

虽然我在将 JPA 应用到 Web 应用程序方面经验丰富,但我现在在将它应用到桌面应用程序方面面临挑战。我可以使用一些指针!

我正在研究基于 JavaFX 的解决方案,但我遇到了延迟加载实体关系的问题。我所追求的用户界面相当简单。一方面,有一个实体列表。单击列表中的其中一个会导致实体详细信息显示在屏幕的另一侧。

显示列表所需的所有信息都是通过 JPA 实体的非延迟加载属性获得的。但是,要显示详细信息(单击后),需要检索相当多的关联实体。鉴于数据量,预先(急切地)将所有数据加载到内存中是不可行的,所以我希望关联的实体被延迟加载。

这是我遇到 JPA 会话管理问题的地方。我还没有想出一种结构化的方式来让会话处于活动状态,可以用来延迟加载关系。

在基于 Web 的环境中,会话范围通常很容易定义。通常,HTTP 请求本身可用于定义会话的生命周期。 HTTP 请求形成了用户交互的非常清晰的起点和终点。您如何在非 Web 应用程序中执行此操作?

【问题讨论】:

  • 为什么不使用 JPA 查询而不是延迟加载?此外,如果您的用户开始到处点击,无论如何您最终都会加载所有数据 - 无法垃圾收集?
  • 我的建议是不要在桌面应用上使用 jpa

标签: java jpa orm javafx desktop-application


【解决方案1】:

除非与每个实体关联的延迟加载的数据量非常大,否则从用户的角度来看,一个大到超过内存容量的实体列表将是不可用的。

大致数字:如果每个实体使用 10KB 完全加载,则 10,000 个实体的列表(从用户角度来看完全不可用)将消耗 100MB 内存,这对于桌面应用程序来说非常舒适。

所以我首先要确信延迟初始化是必需的。如果是这样,也许限制数据的策略(例如列表中的分页)会更合适。

如果您确实想要/需要延迟初始化,您可以使用与您在 Web 应用程序中使用的方法类似的方法。正如@AlexNevidomsky 在 cmets 中所建议的那样,JPA 查询可能比简单地访问延迟初始化的属性更合适。

对于会话管理(无论哪种情况),您都可以将用户输入的处理(即事件处理程序)视为 JPA 会话的边界​​(这基本上相当于 HTTP 请求;它是对一个用户操作)。

如果您正在远程访问数据存储库(或更一般地,如果数据请求可能需要很长时间来处理),您将需要在后台处理数据请求并在 FX 应用程序线程上安排 UI 更新当它完成时(尽管这是一个不同的话题)。

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 2013-05-21
    • 1970-01-01
    • 2021-11-19
    • 2011-09-10
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多