我的问题比较简单:
我有一个实体,其中包含许多我不需要的懒加载集。现在我不想急切地加载所有内容,也不想拥有几种不同的 getSlimEntity()、getFullEntity()、getEntityForSpecialOccasion() 方法。
我想做的是默认使用“slim”版本,然后按需加载惰性内容。这种需求可能源于更改网页上显示“任务”实体的选项卡。新选项卡应显示任务的历史记录。但是,此选项卡不经常使用,因此我不急切地想要数据。
解决方案应该尽可能少地对数据库进行操作,因为数据库性能对我们来说是个问题。
我想出的一个可能的解决方案是使用 Session.buildLockRequest() 将任务“重新附加”到 EntityManager 并在我需要的 Set 上调用 Hibernate.initialize()。它看起来像这样:
public Set<HistoryEntry> getHistory(Task task) {
Session session = manager.unwrap(Session.class);
session.buildLockRequest(LockOptions.NONE).lock(task);
Hibernate.initialize(task.getHistory());
return task.getHistory();
}
这是一个苗条且相对易于理解的解决方案,数据库也没有更新或任何东西,只是查询有问题的 HistoryEntries。
现在我的问题是:这个解决方案可以使用吗?它会带来我看不到的任何问题吗?调用 buildLockRequest 实际发生了什么?另外,当多个用户查看同一个任务时会不会有问题?
// 编辑:正如所指出的,此解决方案使用可能与其他持久性提供程序不兼容的 Hibernate 特定调用,例如 EclipseLink 或 OpenJPA。由于这个项目只是内部的,这应该不是问题。