Hibernate 复合id(嵌入)上的联接提取不工作
复合ID的@manytone的Hibernate获取失败,原因是 在EMD ID解析过程中,实体直接从DB加载,而不是从resultSet加载,甚至从会话缓存加载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
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修复的问题的更多说明