0

我目前有工作代码将孩子保存到父实体。但是我想知道我是否做对了,因为我现在通过休眠的选择语句过载。我确实使用缓存,所以 atm 我没有延迟问题,但我想知道我是否不能提高效率。以这个小摘录为例

MbaLog.debugLog(logger, "Saving CodeType");
Site site = codeType.getSite();
if (site != null && site.isProxy())
    codeType.setSite(siteRepository.loadSiteById(site.getId()));
Long recordId = codeRepository.saveCodeType(codeType);

我有一个要保存的实体 CodeType,它有一个子站点。这个子对象作为代理对象传递给方法,只填充了它的 id。然后我从数据库中获取一个完全加载的 Site 对象并将其设置为代码类型。接下来,我将带有 hibernate 的 sessionfactory 的 codeType 保存到数据库中(代码在这里不可见,但它在 codeRepository 后面)。

这可行,但我正在加载一个完整的站点,它有自己的孩子,所以我看到在插入之前至少有 5 个查询通过。我可以在网站上放很多懒惰的东西,但目前我宁愿不这样做,因为更深层的代码可能会很复杂。我不得不在工作中学习hibernate和JPA,过去从未接受过专家的太多培训。所以我想知道,是否有将网站保存为 codetype 的快捷方式?我需要完全加载它还是 id 足够?或者只是 id 和版本(我在所有实体上使用 @version 注释进行乐观锁定)

提前致谢

4

2 回答 2

1

不要使用Session.get()(or EntityManager.find()) 来获取对 SIte 实体的引用,而是使用Session.load()(or EntityManager.getReference()) 来获取此引用。

这些方法将在实体上返回延迟加载的代理,而不是执行查询来获取站点的数据。

于 2012-10-27T15:04:22.087 回答
1

如果您只想保留 Site 和 CodeType 之间的关系,那么一个惰性实例可能就足够了。所以你可以使用EntityManager.getReference()(延迟加载)而不是EntityManager.find()

于 2012-10-27T15:07:04.480 回答