Skip to content

Commit 6d77ac3

Browse files
barreirosebersole
authored andcommitted
HHH-9937 - bytecode enhancement - expose loaded state in LazyAttributeLoader
1 parent 4f72f17 commit 6d77ac3

File tree

5 files changed

+50
-7
lines changed

5 files changed

+50
-7
lines changed

hibernate-core/src/main/java/org/hibernate/Hibernate.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88

99
import java.util.Iterator;
1010

11+
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoader;
1112
import org.hibernate.bytecode.instrumentation.internal.FieldInterceptionHelper;
1213
import org.hibernate.bytecode.instrumentation.spi.FieldInterceptor;
1314
import org.hibernate.collection.spi.PersistentCollection;
1415
import org.hibernate.engine.HibernateIterator;
1516
import org.hibernate.engine.jdbc.LobCreator;
1617
import org.hibernate.engine.jdbc.spi.JdbcServices;
18+
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
19+
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
1720
import org.hibernate.engine.spi.SessionImplementor;
1821
import org.hibernate.proxy.HibernateProxy;
1922
import org.hibernate.proxy.LazyInitializer;
@@ -169,13 +172,19 @@ public static boolean isPropertyInitialized(Object proxy, String propertyName) {
169172
entity = proxy;
170173
}
171174

175+
if ( entity instanceof PersistentAttributeInterceptable ) {
176+
PersistentAttributeInterceptor interceptor = ( (PersistentAttributeInterceptable) entity ).$$_hibernate_getInterceptor();
177+
if ( interceptor != null && interceptor instanceof LazyAttributeLoader ) {
178+
return ( (LazyAttributeLoader) interceptor ).isAttributeLoaded( propertyName );
179+
}
180+
}
181+
172182
if ( FieldInterceptionHelper.isInstrumented( entity ) ) {
173183
final FieldInterceptor interceptor = FieldInterceptionHelper.extractFieldInterceptor( entity );
174184
return interceptor == null || interceptor.isInitialized( propertyName );
175185
}
176-
else {
177-
return true;
178-
}
186+
187+
return true;
179188
}
180189

181190
}

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/interceptor/LazyAttributeLoader.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*/
2323
public class LazyAttributeLoader implements PersistentAttributeInterceptor {
2424

25-
private final transient SessionImplementor session;
25+
private transient SessionImplementor session;
2626
private final Set<String> lazyFields;
2727
private final String entityName;
2828

@@ -35,7 +35,7 @@ public LazyAttributeLoader(SessionImplementor session, Set<String> lazyFields, S
3535
}
3636

3737
protected final Object intercept(Object target, String fieldName, Object value) {
38-
if ( lazyFields != null && lazyFields.contains( fieldName ) && !initializedFields.contains( fieldName ) ) {
38+
if ( !isAttributeLoaded( fieldName ) ) {
3939
if ( session == null ) {
4040
throw new LazyInitializationException( "entity with lazy properties is not associated with a session" );
4141
}
@@ -58,6 +58,25 @@ else if ( !session.isOpen() || !session.isConnected() ) {
5858
}
5959
}
6060

61+
public final void setSession(SessionImplementor session) {
62+
this.session = session;
63+
}
64+
65+
public boolean isAttributeLoaded(String fieldName) {
66+
return lazyFields == null || !lazyFields.contains( fieldName ) || initializedFields.contains( fieldName );
67+
}
68+
69+
public boolean isUninitialized() {
70+
if ( lazyFields != null ) {
71+
for ( String fieldName : lazyFields ) {
72+
if ( !initializedFields.contains( fieldName ) ) {
73+
return true;
74+
}
75+
}
76+
}
77+
return false;
78+
}
79+
6180
public void setLoaded(String attributeName) {
6281
initializedFields.add( attributeName );
6382
}

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.hibernate.Session;
3434
import org.hibernate.StaleObjectStateException;
3535
import org.hibernate.StaleStateException;
36+
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoader;
3637
import org.hibernate.bytecode.instrumentation.spi.FieldInterceptor;
3738
import org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer;
3839
import org.hibernate.bytecode.spi.EntityInstrumentationMetadata;
@@ -62,6 +63,8 @@
6263
import org.hibernate.engine.spi.LoadQueryInfluencers;
6364
import org.hibernate.engine.spi.Mapping;
6465
import org.hibernate.engine.spi.PersistenceContext.NaturalIdHelper;
66+
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
67+
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
6568
import org.hibernate.engine.spi.SessionFactoryImplementor;
6669
import org.hibernate.engine.spi.SessionImplementor;
6770
import org.hibernate.engine.spi.ValueInclusion;
@@ -4196,6 +4199,13 @@ public void afterReassociate(Object entity, SessionImplementor session) {
41964199
}
41974200
}
41984201

4202+
if ( entity instanceof PersistentAttributeInterceptable ) {
4203+
PersistentAttributeInterceptor interceptor = ( (PersistentAttributeInterceptable) entity ).$$_hibernate_getInterceptor();
4204+
if ( interceptor != null && interceptor instanceof LazyAttributeLoader ) {
4205+
( (LazyAttributeLoader) interceptor ).setSession( session );
4206+
}
4207+
}
4208+
41994209
handleNaturalIdReattachment( entity, session );
42004210
}
42014211

hibernate-core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,12 @@ public void afterInitialize(Object entity, boolean lazyPropertiesAreUnfetched, S
309309
@Override
310310
public boolean hasUninitializedLazyProperties(Object entity) {
311311
if ( getEntityMetamodel().hasLazyProperties() ) {
312+
if ( entity instanceof PersistentAttributeInterceptable ) {
313+
PersistentAttributeInterceptor interceptor = ( (PersistentAttributeInterceptable) entity ).$$_hibernate_getInterceptor();
314+
if ( interceptor != null && interceptor instanceof LazyAttributeLoader ) {
315+
return ( (LazyAttributeLoader) interceptor ).isUninitialized();
316+
}
317+
}
312318
FieldInterceptor callback = FieldInterceptionHelper.extractFieldInterceptor( entity );
313319
return callback != null && !callback.isInitialized();
314320
}

hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77
package org.hibernate.test.bytecode.enhancement;
88

9-
import org.hibernate.test.bytecode.enhancement.lazy.LazyBasicFieldNotInitializedTestTask;
109
import org.hibernate.testing.FailureExpected;
1110
import org.hibernate.testing.TestForIssue;
1211
import org.hibernate.testing.junit4.BaseUnitTestCase;
@@ -19,6 +18,7 @@
1918
import org.hibernate.test.bytecode.enhancement.join.HHH3949TestTask2;
2019
import org.hibernate.test.bytecode.enhancement.join.HHH3949TestTask3;
2120
import org.hibernate.test.bytecode.enhancement.join.HHH3949TestTask4;
21+
import org.hibernate.test.bytecode.enhancement.lazy.LazyBasicFieldNotInitializedTestTask;
2222
import org.hibernate.test.bytecode.enhancement.lazy.LazyLoadingIntegrationTestTask;
2323
import org.hibernate.test.bytecode.enhancement.lazy.LazyLoadingTestTask;
2424
import org.junit.Test;
@@ -75,7 +75,6 @@ public void testHHH3949() {
7575

7676
@Test
7777
@TestForIssue( jiraKey = "HHH-9937")
78-
@FailureExpected( jiraKey = "HHH-9937")
7978
public void testLazyBasicFieldNotInitialized() {
8079
EnhancerTestUtils.runEnhancerTestTask( LazyBasicFieldNotInitializedTestTask.class );
8180
}

0 commit comments

Comments
 (0)