JPA延迟加载性能有多重要?

我理解这对于具体的应用是非常具体的,但我只是想知道一般意见是什么,或者至少在这个问题上有一些个人经验。

我对“视图中的开放会话”模式感到厌恶,所以为了避免这种情况,我正在考虑简单地抓取所有内容,并在服务层中使用查询来获取更大的内容。

有人用这个并后悔了吗? 是否有一些优雅的解决方案可以在视图层中延迟加载我不知道的?

延迟加载仅在您根本不打算使用相关数据时才有用(例如,仅显示客户列表,因此忽略嵌套的订单集),或者如果不确定用户是否愿意查看有问题的数据(例如,在内存中有客户列表,订单列表请求取决于未来的操作)。

如果您确定一次显示所有数据,则不需要延迟加载,只需要额外的查询。

如果您有一个设计良好的架构和广泛映射到应用程序中其他实体的实体,则基本上需要延迟加载。 这是一个非常基本的例子:

人员实体映射一个到多个引荐

推荐一对一两次( 推荐人和推荐人)

很简单吧? 好吧,如果你在这两种关系中使用预先加载,你最终可能会对大多数情况下可能无法显示的数据进行大量后续查询。

例如:

您的应用程序想要加载记录“ PersonA ”,并且此PersonA有3个推荐记录,因为他提到了3个客户: PersonBPersonCPersonD

因此,如果你有Eager获取这种关系,JPA将加载这3个人的记录。 让我们说PersonC推荐了10位顾客,因为他喜欢你卖的任何东西。 现在,JPA也必须加载这10个客户,这也是因为需要加载。

你可以看到这是怎么回事。 如果这是一个延迟加载的关系,那么加载这一额外数据集的唯一时间就是你直接对它进行getReferrals()调用。

我个人会避免创建其他方法来进行这些提取。 它需要很多额外的代码工作,现在你需要以某种方式管理实体的状态以及是否需要进行额外的加载。

如果您使用延迟加载,JPA可以轻松实现。 只要做任何事情…()调用你通常会在实体POJO上做,而JPA会做其余的事情。