虽然我在将JPA应用于Web应用程序方面经验丰富,但我现在面临将其应用于桌面应用程序的挑战。我可以使用一些指针!
我致力于基于JavaFX的解决方案,并且我面临着延迟加载实体关系的问题。我之后的用户界面非常简单。一方面,有一个实体清单。单击列表中的其中一个会导致实体详细信息显示在屏幕的另一侧。
显示列表所需的所有信息都是通过JPA实体的非延迟加载属性获得的。但是,要显示详细信息(单击后),需要检索相当多的关联实体。鉴于数据量,预先将所有数据(急切地)加载到内存中是不可行的,因此我希望关联实体是延迟加载的。
这是我遇到JPA会话管理问题的地方。我无法想出一种结构化的方式,让会话处于活动状态,可用于延迟加载关系。
在基于Web的环境中,会话范围通常很容易定义。通常,HTTP请求本身可用于定义会话的生命周期。 HTTP请求形成了非常明确的用户交互的起点和终点。你如何在非网络应用程序中这样做?
答案 0 :(得分:1)
除非与每个实体相关联的延迟加载数据量非常大,否则从用户的角度来看,大到足以超过内存容量的实体列表将无法使用。
在球场编号中:如果每个实体使用10KB完全加载,则10,000个实体的列表(从用户角度来看完全无法使用)将消耗100MB内存,这对于桌面应用程序来说非常舒适。
所以我首先想要确信需要延迟初始化。如果是这样,也许限制数据的策略(例如列表中的分页)会更合适。
如果您确实需要/需要延迟初始化,则可以使用与Web应用程序中使用的方法类似的方法。正如@AlexNevidomsky在评论中建议的那样,JPA查询可能比简单地访问lazily-initialized属性更合适。
对于会话管理(在任何一种情况下),您可以将用户输入的处理(即事件处理程序)视为JPA会话的边界(这基本上等同于HTTP请求;它是对a的响应用户行动)。
如果要远程访问数据存储库(或者更常见的是,如果数据请求可能需要很长时间才能处理),则需要在后台处理数据请求并在FX应用程序线程上安排UI更新当它完成时(虽然这是一个不同的主题)。