我目前有工作代码将子节点保存到父实体。但是我想知道我是否正在做正确的事情,因为我现在通过hibernate对select语句有一个重载。我确实使用缓存所以我没有延迟问题,但我想知道我是否能更有效率。以这个小提取物为例
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对象并将其设置为codetype。接下来,我将带有hibernate的sessionfactory的codeType保存到数据库中(代码在这里不可见,但它在codeRepository后面)。
这有效,但是我正在加载一个完整的网站,它有自己的子网,所以我看到在插入之前至少传递了5个查询。我可以在网站上放置很多懒惰的东西,但是由于可能在更深层次的代码复杂化,我暂时不这样做。我不得不在工作中学习hibernate和JPA,过去从未接受过专家的培训。所以我想知道,是否有一个快捷方式将网站保存在codetype上?我是否需要将其完全装入或足够的ID?或者只是id和版本(我在所有实体上使用@version注释进行乐观锁定)
提前致谢
答案 0 :(得分:1)
使用Session.get()
(或EntityManager.find()
)来获取此引用,而不是使用Session.load()
(或EntityManager.getReference()
)来获取对SIte实体的引用。
这些方法将在实体上返回延迟加载的代理,而不是执行查询以获取站点的数据。
答案 1 :(得分:1)
如果你想坚持的只是Site和CodeType之间的关系,那么懒惰的实例就足够了。因此,您可以使用EntityManager.getReference()(延迟加载)而不是EntityManager.find()。