Skip to content

Commit ab3e4e2

Browse files
DavideDsebersole
authored andcommitted
HHH-18381 Changes for Hibernate Reactive 2.4
1 parent e4a0b69 commit ab3e4e2

12 files changed

+164
-20
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractCompositeIdentifierMapping.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ public AbstractCompositeIdentifierMapping(
7272
this.sessionFactory = creationProcess.getCreationContext().getSessionFactory();
7373
}
7474

75+
/*
76+
* Used by Hibernate Reactive
77+
*/
78+
protected AbstractCompositeIdentifierMapping(AbstractCompositeIdentifierMapping original) {
79+
this.navigableRole = original.navigableRole;
80+
this.entityMapping = original.entityMapping;
81+
this.tableExpression = original.tableExpression;
82+
this.sessionFactory = original.sessionFactory;
83+
}
84+
7585
@Override
7686
public boolean hasContainingClass() {
7787
return true;

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/NonAggregatedIdentifierMappingImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ public NonAggregatedIdentifierMappingImpl(
119119
}
120120
}
121121

122+
/*
123+
* Used by Hibernate Reactive
124+
*/
125+
protected NonAggregatedIdentifierMappingImpl(NonAggregatedIdentifierMappingImpl original) {
126+
super( original );
127+
entityDescriptor = original.entityDescriptor;
128+
virtualIdEmbeddable = original.virtualIdEmbeddable;
129+
idClassEmbeddable = original.idClassEmbeddable;
130+
identifierValueMapper = original.identifierValueMapper;
131+
}
132+
122133
@Override
123134
public EmbeddableMappingType getMappedType() {
124135
return virtualIdEmbeddable;

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,17 @@ public SimpleForeignKeyDescriptor(
167167
);
168168
}
169169

170+
/*
171+
* Used by Hibernate Reactive
172+
*/
173+
protected SimpleForeignKeyDescriptor(SimpleForeignKeyDescriptor original) {
174+
keySide = original.keySide;
175+
targetSide = original.targetSide;
176+
refersToPrimaryKey = original.refersToPrimaryKey;
177+
hasConstraint = original.hasConstraint;
178+
associationKey = original.associationKey;
179+
}
180+
170181
@Override
171182
public String getKeyTable() {
172183
return keySide.getModelPart().getContainingTableExpression();

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ToOneAttributeMapping.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2428,16 +2428,13 @@ public <X, Y> int breakDownJdbcValues(
24282428
return foreignKeyDescriptor.breakDownJdbcValues( value, offset, x, y, valueConsumer, session );
24292429
}
24302430

2431-
private Object extractValue(Object domainValue, SharedSessionContractImplementor session) {
2431+
protected Object extractValue(Object domainValue, SharedSessionContractImplementor session) {
24322432
if ( domainValue == null ) {
24332433
return null;
24342434
}
24352435

24362436
if ( referencedPropertyName != null ) {
2437-
final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( domainValue );
2438-
if ( lazyInitializer != null ) {
2439-
domainValue = lazyInitializer.getImplementation();
2440-
}
2437+
domainValue = lazyInitialize( domainValue );
24412438
assert getAssociatedEntityMappingType()
24422439
.getRepresentationStrategy()
24432440
.getInstantiator()
@@ -2448,7 +2445,19 @@ assert getAssociatedEntityMappingType()
24482445
return foreignKeyDescriptor.getAssociationKeyFromSide( domainValue, sideNature.inverse(), session );
24492446
}
24502447

2451-
private static Object extractAttributePathValue(Object domainValue, EntityMappingType entityType, String attributePath) {
2448+
/**
2449+
* For Hibernate Reactive, because it doesn't support lazy initialization, it will override this method and skip it
2450+
* when possible.
2451+
*/
2452+
protected Object lazyInitialize(Object domainValue) {
2453+
final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( domainValue );
2454+
if ( lazyInitializer != null ) {
2455+
return lazyInitializer.getImplementation();
2456+
}
2457+
return domainValue;
2458+
}
2459+
2460+
protected static Object extractAttributePathValue(Object domainValue, EntityMappingType entityType, String attributePath) {
24522461
if ( ! attributePath.contains( "." ) ) {
24532462
return entityType.findAttributeMapping( attributePath ).getValue( domainValue );
24542463
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/AbstractFetchParent.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ public AbstractFetchParent(NavigablePath navigablePath) {
2727
this.navigablePath = navigablePath;
2828
}
2929

30+
/*
31+
* Used by Hibernate Reactive
32+
*/
33+
public AbstractFetchParent(AbstractFetchParent original) {
34+
navigablePath = original.navigablePath;
35+
fetches = original.fetches;
36+
hasJoinFetches = original.hasJoinFetches;
37+
containsCollectionFetches = original.containsCollectionFetches;
38+
}
39+
3040
public void afterInitialize(FetchParent fetchParent, DomainResultCreationState creationState) {
3141
assert fetches == ImmutableFetchList.EMPTY;
3242
resetFetches( creationState.visitFetches( fetchParent ) );

hibernate-core/src/main/java/org/hibernate/sql/results/graph/InitializerData.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
*/
77
package org.hibernate.sql.results.graph;
88

9+
import java.util.Objects;
10+
911
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
1012

1113
import org.checkerframework.checker.nullness.qual.Nullable;
1214

15+
import static java.util.Objects.requireNonNull;
16+
1317
public abstract class InitializerData {
1418
protected final RowProcessingState rowProcessingState;
1519
protected Initializer.State state = Initializer.State.UNINITIALIZED;
@@ -19,6 +23,16 @@ public InitializerData(RowProcessingState rowProcessingState) {
1923
this.rowProcessingState = rowProcessingState;
2024
}
2125

26+
/*
27+
* Used by Hibernate Reactive
28+
*/
29+
public InitializerData(InitializerData original) {
30+
requireNonNull( original );
31+
this.rowProcessingState = original.rowProcessingState;
32+
this.state = original.state;
33+
this.instance = original.instance;
34+
}
35+
2236
public RowProcessingState getRowProcessingState() {
2337
return rowProcessingState;
2438
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableFetchImpl.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ public EmbeddableFetchImpl(
9090
* For Hibernate Reactive
9191
*/
9292
protected EmbeddableFetchImpl(EmbeddableFetchImpl original) {
93-
super( original.getNavigablePath() );
94-
this.fetchContainer = original.getFetchContainer();
93+
super( original );
94+
fetchContainer = original.getFetchContainer();
9595
fetchParent = original.fetchParent;
9696
fetchTiming = original.fetchTiming;
9797
tableGroup = original.tableGroup;
@@ -155,7 +155,9 @@ public EmbeddableMappingType getReferencedMappingType() {
155155
public DomainResultAssembler<?> createAssembler(
156156
InitializerParent<?> parent,
157157
AssemblerCreationState creationState) {
158-
return new EmbeddableAssembler( creationState.resolveInitializer( this, parent, this ).asEmbeddableInitializer() );
158+
Initializer<?> initializer = creationState.resolveInitializer( this, parent, this );
159+
EmbeddableInitializer<?> embeddableInitializer = initializer.asEmbeddableInitializer();
160+
return new EmbeddableAssembler( embeddableInitializer );
159161
}
160162

161163
@Override
@@ -180,4 +182,8 @@ public boolean appliesTo(GraphImplementor<?> graphImplementor, JpaMetamodel meta
180182
public FetchParent asFetchParent() {
181183
return this;
182184
}
185+
186+
protected BasicFetch<?> getDiscriminatorFetch() {
187+
return discriminatorFetch;
188+
}
183189
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableForeignKeyResultImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ public class EmbeddableForeignKeyResultImpl<T>
3838
private final FetchParent fetchParent;
3939
private final EmbeddableMappingType fetchContainer;
4040

41+
/*
42+
* Used by Hibernate Reactive
43+
*/
4144
public EmbeddableForeignKeyResultImpl(
4245
NavigablePath navigablePath,
4346
EmbeddableValuedModelPart embeddableValuedModelPart,
@@ -51,6 +54,13 @@ public EmbeddableForeignKeyResultImpl(
5154
resetFetches( creationState.visitFetches( this ) );
5255
}
5356

57+
protected EmbeddableForeignKeyResultImpl(EmbeddableForeignKeyResultImpl<T> original) {
58+
super( original );
59+
this.resultVariable = original.resultVariable;
60+
this.fetchParent = original.fetchParent;
61+
this.fetchContainer = original.fetchContainer;
62+
}
63+
5464
@Override
5565
public FetchParent getRoot() {
5666
return fetchParent.getRoot();

hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NonAggregatedIdentifierMappingInitializer.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.util.ArrayList;
1010
import java.util.function.BiConsumer;
11+
import java.util.function.Function;
1112

1213
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
1314
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -95,6 +96,15 @@ public NonAggregatedIdentifierMappingInitializer(
9596
InitializerParent<?> parent,
9697
AssemblerCreationState creationState,
9798
boolean isResultInitializer) {
99+
this( resultDescriptor, parent, creationState, isResultInitializer, Function.identity() );
100+
}
101+
102+
protected NonAggregatedIdentifierMappingInitializer(
103+
EmbeddableResultGraphNode resultDescriptor,
104+
InitializerParent<?> parent,
105+
AssemblerCreationState creationState,
106+
boolean isResultInitializer,
107+
Function<Fetch, Fetch> fetchConverter) {
98108
super( creationState );
99109
this.navigablePath = resultDescriptor.getNavigablePath();
100110
this.embedded = (NonAggregatedIdentifierMapping) resultDescriptor.getReferencedMappingContainer();
@@ -107,7 +117,7 @@ public NonAggregatedIdentifierMappingInitializer(
107117
this.hasIdClass = embedded.hasContainingClass() && virtualIdEmbeddable != representationEmbeddable;
108118

109119
this.sessionFactory = creationState.getSqlAstCreationContext().getSessionFactory();
110-
this.assemblers = createAssemblers( this, resultDescriptor, creationState, virtualIdEmbeddable );
120+
this.assemblers = createAssemblers( this, resultDescriptor, creationState, virtualIdEmbeddable, fetchConverter );
111121
final ArrayList<Initializer<?>> initializers = new ArrayList<>( assemblers.length );
112122
for ( DomainResultAssembler<?> assembler : assemblers ) {
113123
final Initializer<?> initializer = assembler.getInitializer();
@@ -125,12 +135,13 @@ protected static DomainResultAssembler<?>[] createAssemblers(
125135
InitializerParent<?> parent,
126136
EmbeddableResultGraphNode resultDescriptor,
127137
AssemblerCreationState creationState,
128-
EmbeddableMappingType embeddableTypeDescriptor) {
138+
EmbeddableMappingType embeddableTypeDescriptor,
139+
Function<Fetch, Fetch> fetchConverter) {
129140
final int size = embeddableTypeDescriptor.getNumberOfFetchables();
130141
final DomainResultAssembler<?>[] assemblers = new DomainResultAssembler[size];
131142
for ( int i = 0; i < size; i++ ) {
132143
final Fetchable stateArrayContributor = embeddableTypeDescriptor.getFetchable( i );
133-
final Fetch fetch = resultDescriptor.findFetch( stateArrayContributor );
144+
final Fetch fetch = fetchConverter.apply( resultDescriptor.findFetch( stateArrayContributor ) );
134145

135146
final DomainResultAssembler<?> stateAssembler = fetch == null
136147
? new NullValueAssembler<>( stateArrayContributor.getJavaType() )
@@ -340,6 +351,13 @@ public boolean isPartOfKey() {
340351
return true;
341352
}
342353

354+
/*
355+
* Used by Hibernate Reactive
356+
*/
357+
protected Initializer<InitializerData>[] getInitializers() {
358+
return initializers;
359+
}
360+
343361
@Override
344362
public String toString() {
345363
return "NonAggregatedIdentifierMappingInitializer(" + navigablePath + ") : `" + getInitializedPart().getJavaType().getJavaTypeClass() + "`";

hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityDelayedFetchInitializer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,7 @@ protected DomainResultAssembler<?> getIdentifierAssembler() {
315315
return identifierAssembler;
316316
}
317317

318+
protected @Nullable BasicResultAssembler<?> getDiscriminatorAssembler() {
319+
return discriminatorAssembler;
320+
}
318321
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityInitializerImpl.java

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,23 @@ public static class EntityInitializerData extends InitializerData {
143143
public EntityInitializerData(RowProcessingState rowProcessingState) {
144144
super( rowProcessingState );
145145
}
146+
147+
/*
148+
* Used by Hibernate Reactive
149+
*/
150+
public EntityInitializerData(EntityInitializerData original) {
151+
super( original );
152+
this.shallowCached = original.shallowCached;
153+
this.lockMode = original.lockMode;
154+
this.uniqueKeyAttributePath = original.uniqueKeyAttributePath;
155+
this.uniqueKeyPropertyTypes = original.uniqueKeyPropertyTypes;
156+
this.canUseEmbeddedIdentifierInstanceAsEntity = original.canUseEmbeddedIdentifierInstanceAsEntity;
157+
this.hasCallbackActions = original.hasCallbackActions;
158+
this.concreteDescriptor = original.concreteDescriptor;
159+
this.entityKey = original.entityKey;
160+
this.entityInstanceForNotify = original.entityInstanceForNotify;
161+
this.entityHolder = original.entityHolder;
162+
}
146163
}
147164

148165
public EntityInitializerImpl(
@@ -473,7 +490,7 @@ private void notifySubInitializersToReusePreviousRowInstance(EntityInitializerDa
473490
}
474491
}
475492

476-
private void resolveKeySubInitializers(EntityInitializerData data) {
493+
protected void resolveKeySubInitializers(EntityInitializerData data) {
477494
final RowProcessingState rowProcessingState = data.getRowProcessingState();
478495
for ( Initializer<?> initializer : subInitializers[data.concreteDescriptor.getSubclassId()] ) {
479496
if ( initializer != null ) {
@@ -714,7 +731,7 @@ protected void initializeAttributeType(Type[] attributeTypes, EntityPersister en
714731
}
715732
}
716733

717-
private boolean useEmbeddedIdentifierInstanceAsEntity(EntityInitializerData data) {
734+
protected boolean useEmbeddedIdentifierInstanceAsEntity(EntityInitializerData data) {
718735
return data.canUseEmbeddedIdentifierInstanceAsEntity
719736
&& ( data.concreteDescriptor = determineConcreteEntityDescriptor( data.getRowProcessingState(), discriminatorAssembler, entityDescriptor ) ) != null
720737
&& data.concreteDescriptor.isInstance( data.getRowProcessingState().getEntityId() );
@@ -939,7 +956,7 @@ protected Object getEntityFromExecutionContext(EntityInitializerData data) {
939956
return null;
940957
}
941958

942-
private void upgradeLockMode(EntityInitializerData data) {
959+
protected void upgradeLockMode(EntityInitializerData data) {
943960
final RowProcessingState rowProcessingState = data.getRowProcessingState();
944961
if ( data.lockMode != LockMode.NONE && rowProcessingState.upgradeLocks() ) {
945962
final EntityEntry entry = data.entityHolder.getEntityEntry();
@@ -1117,7 +1134,7 @@ protected boolean consistentInstance(EntityInitializerData data) {
11171134
return entity == null || entity == data.entityInstanceForNotify;
11181135
}
11191136

1120-
private void initializeEntityInstance(EntityInitializerData data) {
1137+
protected void initializeEntityInstance(EntityInitializerData data) {
11211138
final RowProcessingState rowProcessingState = data.getRowProcessingState();
11221139
final Object entityIdentifier = data.entityKey.getIdentifier();
11231140
final SharedSessionContractImplementor session = rowProcessingState.getSession();
@@ -1379,7 +1396,7 @@ protected Object[] extractConcreteTypeStateValues(EntityInitializerData data) {
13791396
return values;
13801397
}
13811398

1382-
private void resolveState(EntityInitializerData data) {
1399+
protected void resolveState(EntityInitializerData data) {
13831400
final RowProcessingState rowProcessingState = data.getRowProcessingState();
13841401
for ( final DomainResultAssembler<?> assembler : assemblers[data.concreteDescriptor.getSubclassId()] ) {
13851402
if ( assembler != null ) {
@@ -1527,16 +1544,31 @@ public String toString() {
15271544
// For Hibernate Reactive
15281545
//#########################
15291546

1530-
protected DomainResultAssembler<?> getVersionAssembler() {
1547+
protected @Nullable DomainResultAssembler<?> getVersionAssembler() {
15311548
return versionAssembler;
15321549
}
15331550

1534-
protected DomainResultAssembler<Object> getRowIdAssembler() {
1551+
protected @Nullable DomainResultAssembler<Object> getRowIdAssembler() {
15351552
return rowIdAssembler;
15361553
}
15371554

1538-
protected DomainResultAssembler<?>[][] getAssemblers() {
1555+
protected @Nullable DomainResultAssembler<?>[][] getAssemblers() {
15391556
return assemblers;
15401557
}
15411558

1559+
protected @Nullable BasicResultAssembler<?> getDiscriminatorAssembler() {
1560+
return discriminatorAssembler;
1561+
}
1562+
1563+
protected boolean isKeyManyToOne() {
1564+
return hasKeyManyToOne;
1565+
}
1566+
1567+
protected Initializer<?>[][] getSubInitializers() {
1568+
return subInitializers;
1569+
}
1570+
1571+
public @Nullable DomainResultAssembler<?> getKeyAssembler() {
1572+
return keyAssembler;
1573+
}
15421574
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntitySelectFetchInitializer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ public EntitySelectFetchInitializerData(RowProcessingState rowProcessingState) {
6464
super( rowProcessingState );
6565
}
6666

67+
/*
68+
* Used by Hibernate Reactive
69+
*/
70+
public EntitySelectFetchInitializerData(EntitySelectFetchInitializerData original) {
71+
super( original );
72+
this.entityIdentifier = original.entityIdentifier;
73+
}
6774
}
6875

6976
public EntitySelectFetchInitializer(
@@ -312,4 +319,7 @@ public String toString() {
312319
return "EntitySelectFetchInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
313320
}
314321

322+
public DomainResultAssembler<?> getKeyAssembler() {
323+
return keyAssembler;
324+
}
315325
}

0 commit comments

Comments
 (0)