Hibernate 复合id(嵌入)上的联接提取不工作

Hibernate 复合id(嵌入)上的联接提取不工作,hibernate,jpa,Hibernate,Jpa,复合ID的@manytone的Hibernate获取失败,原因是 在EMD ID解析过程中,实体直接从DB加载,而不是从resultSet加载,甚至从会话缓存加载 protected final Object resolveIdentifier(Serializable id, SessionImplementor session) throws HibernateException { EntityPersister entityPersister = session.getF

复合ID的@manytone的Hibernate获取失败,原因是 在EMD ID解析过程中,实体直接从DB加载,而不是从resultSet加载,甚至从会话缓存加载

protected final Object resolveIdentifier(Serializable id, SessionImplementor session) throws HibernateException {
        EntityPersister entityPersister = session.getFactory()
        .getEntityPersister( getAssociatedEntityName() );
        boolean isProxyUnwrapEnabled = unwrapProxy &&
                entityPersister.isInstrumented( session.getEntityMode() );      
            proxyOrEntity = loader.instanceNotYetLoaded(rs, i, persisters[i], descriptors[i].getRowIdAlias(), 
                            entityKey, lockModes[i], null, null, hydratedObjects, session);
                    return proxyOrEntity;
                }                           
            }
        } catch (Exception e) {
            throw new HibernateException(e);
        } 
其结果是,如果加载一个实体的100条记录,其中复合ID为另外两个实体,则将有:1+2*100个查询

org.hibernate.type.EntityType
   org.hibernate.type.EntityType

   protected final Object resolveIdentifier(Serializable id, SessionImplementor session) throws HibernateException {
        EntityPersister entityPersister = session.getFactory()
                        .getEntityPersister( getAssociatedEntityName() );
        boolean isProxyUnwrapEnabled = unwrapProxy &&
                                entityPersister.isInstrumented( session.getEntityMode() );      
        /**** first check the session cache *****/
        EntityKey entityKey = new EntityKey(id, 
                                entityPersister, session.getEntityMode() );
                    Object proxyOrEntity = session.getPersistenceContext().getEntity( entityKey );            
        if (proxyOrEntity!=null)
            return proxyOrEntity;
        /**** second check the fetchs of resultSet *****/
        try {
             if ( loader!=null && !rs.isClosed() ){         
                 final EntityAliases[] descriptors = loader.getEntityAliases_();                                    
                 String[] identifierAliases = (String[]) PrivateAccessor.getPrivateField( entityPersister, "identifierAliases", true);              
                 for (int i=0;i<descriptors.length;i++){
                    boolean founds = true;
                    for(int j=0;j<identifierAliases.length;j++){                                                       if (descriptors[i].getSuffixedKeyAliases().length!=identifierAliases.length)
                            founds = false;
                    else
                        if (!descriptors[i].getSuffixedKeyAliases()[j].toString().startsWith(identifierAliases[j]))
                        founds = false;                     
                    }       
                    if (!founds)
                     continue; 
    proxyOrEntity = loader.instanceNotYetLoaded(rs, i, persisters[i], descriptors[i].getRowIdAlias(), entityKey, lockModes[i], null, null, hydratedObjects, session);
            return proxyOrEntity;
            }                           
       }
    } catch (Exception e) {
        throw new HibernateException(e);
    }
    /***** old code *****/
        proxyOrEntity = session.internalLoad(
                getAssociatedEntityName(),
                id,
                eager,
                isNullable() && !isProxyUnwrapEnabled
            );

        if ( proxyOrEntity instanceof HibernateProxy ) {
            ( ( HibernateProxy ) proxyOrEntity ).getHibernateLazyInitializer()
                        .setUnwrap( isProxyUnwrapEnabled );
        }

    return proxyOrEntity;
受保护的最终对象resolveIdentifier(可序列化id,SessionImplementor会话)引发HibernateeException{ EntityPersister EntityPersister=session.getFactory() .getEntityPersister(getAssociatedEntityName()); 布尔IsProxyUnwrappEnabled=unwrapProxy&& isInstrumented(session.getEntityMode()); /****首先检查会话缓存*****/ EntityKey EntityKey=新的EntityKey(id, entityPersister,session.getEntityMode()); Object proxyOrEntity=session.getPersistenceContext().getEntity(entityKey); 如果(代理实体!=null) 返回代理; /****第二步检查resultSet的获取*****/ 试一试{ 如果(loader!=null&&!rs.isClosed()){ final EntityAlias[]描述符=loader.GetEntityAlias_389;(); String[]identifierAliases=(String[])PrivateAccessor.getPrivateField(entityPersister,“identifierAliases”,true);
对于(int i=0;i您能否提供更多信息,例如它生成的查询以及您如何执行查询?我添加了关于修改org.hibernate.loader.loader、org.hibernate.type.ComponentType和org.hibernate.type.EntityType修复的问题的更多说明