hibernate如何从缓存中获取peristent对象(1/2)

hibernate如何从缓存中获取peristent对象(1/2),hibernate,Hibernate,HibernateAPI如何第二次从缓存第1级和第2级获取持久对象 我知道,第一个请求从数据库中获取,并给出持久对象,如果启用,还将其放入一级缓存和二级缓存 当我第二次查询它将如何从缓存中提取时?加载和获取将如何获取 另外,equals、hashcode在持久pojo中的作用是什么?基于这个等式,它将从缓存中获取持久对象吗 如果equals未能以正确的方式实现,那么将发生什么,这意味着每次它都会命中数据库?当您的实体在当前会话中被管理时,将被置于PersistenceContext中 每个loa

HibernateAPI如何第二次从缓存第1级和第2级获取持久对象

我知道,第一个请求从数据库中获取,并给出持久对象,如果启用,还将其放入一级缓存和二级缓存

当我第二次查询它将如何从缓存中提取时?加载和获取将如何获取

另外,equals、hashcode在持久pojo中的作用是什么?基于这个等式,它将从缓存中获取持久对象吗

如果equals未能以正确的方式实现,那么将发生什么,这意味着每次它都会命中数据库?

当您的实体在当前会话中被管理时,将被置于PersistenceContext中

每个load或get操作都将查询该上下文,如果该实体存在,则返回其实例,否则将命中数据库。延迟加载也会发生这种情况

实现equals和hashcode

打算以推荐的方式将持久类的实例放在一个集合中,以表示多值关联和 打算使用分离实例的重新附着

第一级缓存不使用equals方法来管理其上下文。StatefulPersistenceContext使用EntityKey

从DefaultLoadEventListener类

因此,缓存时不需要等于

@Override
public boolean containsEntity(EntityKey key) {
    return entitiesByKey.containsKey( key );
}
    protected Object loadFromSessionCache(
        final LoadEvent event,
        final EntityKey keyToLoad,
        final LoadEventListener.LoadType options) throws HibernateException {

    SessionImplementor session = event.getSession();
    Object old = session.getEntityUsingInterceptor( keyToLoad );

    if ( old != null ) {
        // this object was already loaded
        EntityEntry oldEntry = session.getPersistenceContext().getEntry( old );
        if ( options.isCheckDeleted() ) {
            Status status = oldEntry.getStatus();
            if ( status == Status.DELETED || status == Status.GONE ) {
                return REMOVED_ENTITY_MARKER;
            }
        }
        if ( options.isAllowNulls() ) {
            final EntityPersister persister = event.getSession()
                    .getFactory()
                    .getEntityPersister( keyToLoad.getEntityName() );
            if ( !persister.isInstance( old ) ) {
                return INCONSISTENT_RTN_CLASS_MARKER;
            }
        }
        upgradeLock( old, oldEntry, event.getLockOptions(), event.getSession() );
    }

    return old;
}