@@ -16,6 +16,8 @@
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.engine.internal.ForeignKeys;
+import org.hibernate.engine.spi.EntityEntry;
+import org.hibernate.engine.spi.EntityKey;
import org.hibernate.engine.spi.EntityUniqueKey;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.engine.spi.PersistenceContext;
@@ -26,6 +28,7 @@
import org.hibernate.persister.entity.Joinable;
import org.hibernate.persister.entity.UniqueKeyLoadable;
import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.proxy.LazyInitializer;
/**
* Base for types which map associations to persistent entities.
@@ -696,16 +699,33 @@
final PersistenceContext persistenceContext = session.getPersistenceContext();
Object result = persistenceContext.getEntity( euk );
if ( result == null ) {
- result = persister.loadByUniqueKey( uniqueKeyPropertyName, key, session );
-
- - - if (result != null) {
- persistenceContext.addEntity(euk, result);
+ EntityKey entityKey = session.generateEntityKey( (Serializable) key, persister);
+ result = persistenceContext.getProxy( entityKey );
+ if ( result == null ) {
+ if ( persister.hasProxy() ) {
+ result = persister.createProxy( (Serializable) key, session );
+ persistenceContext.getBatchFetchQueue().addBatchLoadableEntityKey( entityKey );
+ persistenceContext.addProxy( entityKey, result );
+ } else {
+ result = persister.loadByUniqueKey( uniqueKeyPropertyName, key, session );
+
+ + + if (result != null) {
+ persistenceContext.addEntity(euk, result);
+ }
+ }
+ } else {
+ LazyInitializer li = ( (HibernateProxy) result ).getHibernateLazyInitializer();
+ if ( li.isUnwrap() ) {
+ result = li.getImplementation();
+ } else {
+ result = persistenceContext.narrowProxy( result, persister, entityKey, null);
+ }
}
}
- return result == null ? null : persistenceContext.proxyFor( result );
+ return result;
}
}