使用Hibernate的@NaturalId查找对象的优点

bru*_*azi 5 java orm caching hibernate natural-key

使用Hibernate的@NaturalId查找对象有什么好处吗?

我担心Hibernate使用@NaturalId执行两个查询以获取对象这一事实.第一个查询只是为了获取id和第二个查询来加载真实对象.

Vla*_*cea 8

正如我在本文中解释的那样,主要的优点是您可以使用Cache来解析实体而无需访问数据库.

ResolveNaturalIdEvent被抛出时,Hibernate会尝试:

  • 从第一级缓存加载关联的实体ID
  • 从第二级缓存加载关联的实体ID(如果启用)
  • 如果第一级缓存无法满足我们的请求,则回退到数据库查询

    Serializable entityId = resolveFromCache( event );
    if ( entityId != null ) {
        if ( traceEnabled )
            LOG.tracev( "Resolved object in cache: {0}",
                    MessageHelper.infoString( persister, event.getNaturalIdValues(), event.getSession().getFactory() ) );
        return entityId;
    }
    
    return loadFromDatasource( event );
    
    Run Code Online (Sandbox Code Playgroud)

因此,它与使用通过持久性上下文API加载的实体(例如EntityManager.find())具有相同的好处.

执行两个查询的唯一时间是实体尚未缓存(第一级或第二级缓存).