Skip to content

Commit 1fe23ae

Browse files
DavideDsebersole
authored andcommitted
HHH-18854 - Changes for Hibernate Reactive 3.0 integration
1 parent 49886d1 commit 1fe23ae

14 files changed

+142
-57
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/JsonHelper.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.hibernate.type.descriptor.jdbc.AggregateJdbcType;
4343
import org.hibernate.type.descriptor.jdbc.ArrayJdbcType;
4444
import org.hibernate.type.descriptor.jdbc.JdbcType;
45-
import org.hibernate.type.descriptor.jdbc.JsonArrayJdbcType;
4645

4746
import static org.hibernate.dialect.StructHelper.getEmbeddedPart;
4847
import static org.hibernate.dialect.StructHelper.instantiate;
@@ -363,16 +362,17 @@ public static <X> X fromString(
363362
return (X) values;
364363
}
365364

365+
// This is also used by Hibernate Reactive
366366
public static <X> X arrayFromString(
367367
JavaType<X> javaType,
368-
JsonArrayJdbcType jsonArrayJdbcType,
368+
JdbcType elementJdbcType,
369369
String string,
370370
WrapperOptions options) throws SQLException {
371371
if ( string == null ) {
372372
return null;
373373
}
374374
final JavaType<?> elementJavaType = ((BasicPluralJavaType<?>) javaType).getElementJavaType();
375-
final Class<?> preferredJavaTypeClass = jsonArrayJdbcType.getElementJdbcType().getPreferredJavaTypeClass( options );
375+
final Class<?> preferredJavaTypeClass = elementJdbcType.getPreferredJavaTypeClass( options );
376376
final JavaType<?> jdbcJavaType;
377377
if ( preferredJavaTypeClass == null || preferredJavaTypeClass == elementJavaType.getJavaTypeClass() ) {
378378
jdbcJavaType = elementJavaType;
@@ -390,7 +390,7 @@ public static <X> X arrayFromString(
390390
arrayList,
391391
elementJavaType,
392392
jdbcJavaType,
393-
jsonArrayJdbcType.getElementJdbcType()
393+
elementJdbcType
394394
);
395395
assert string.charAt( i - 1 ) == ']';
396396
return javaType.wrap( arrayList, options );

hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ public QualifiedName getPhysicalName() {
111111
return physicalTableName;
112112
}
113113

114+
/*
115+
* Used by Hibernate Reactive
116+
*/
117+
public Identifier getLogicalValueColumnNameIdentifier() {
118+
return logicalValueColumnNameIdentifier;
119+
}
120+
114121
@Override
115122
public int getInitialValue() {
116123
return initialValue;

hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeModelCreationContext.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
import org.hibernate.engine.spi.SessionFactoryImplementor;
1515
import org.hibernate.generator.Generator;
1616
import org.hibernate.mapping.GeneratorSettings;
17+
import org.hibernate.mapping.PersistentClass;
18+
import org.hibernate.persister.entity.EntityPersister;
1719
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
1820
import org.hibernate.service.ServiceRegistry;
21+
import org.hibernate.tuple.entity.EntityMetamodel;
1922
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
2023
import org.hibernate.type.spi.TypeConfiguration;
2124

@@ -64,4 +67,11 @@ default MetadataImplementor getMetadata() {
6467
Map<String, Generator> getGenerators();
6568

6669
GeneratorSettings getGeneratorSettings();
70+
71+
/*
72+
* Used by Hibernate Reactive
73+
*/
74+
default EntityMetamodel createEntityMetamodel(PersistentClass persistentClass, EntityPersister persister) {
75+
return new EntityMetamodel( persistentClass, persister, this );
76+
}
6777
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ public AbstractEntityPersister(
500500
isLazyPropertiesCacheable = true;
501501
}
502502

503-
entityMetamodel = new EntityMetamodel( persistentClass, this, creationContext );
503+
entityMetamodel = creationContext.createEntityMetamodel( persistentClass, this );
504504

505505
entityEntryFactory = entityMetamodel.isMutable()
506506
? MutableEntityEntryFactory.INSTANCE

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ public JoinedSubclassEntityPersister(
160160
final EntityDataAccess cacheAccessStrategy,
161161
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
162162
final RuntimeModelCreationContext creationContext) throws HibernateException {
163-
164163
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
165164

166165
final Dialect dialect = creationContext.getDialect();

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ public SingleTableEntityPersister(
114114
final EntityDataAccess cacheAccessStrategy,
115115
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
116116
final RuntimeModelCreationContext creationContext) throws HibernateException {
117-
118117
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
119118

120119
final Dialect dialect = creationContext.getDialect();

hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ protected MutationOperationGroup createOperationGroup(ValuesAnalysis valuesAnaly
8282
case 0:
8383
return MutationOperationGroupFactory.noOperations( mutationGroup );
8484
case 1: {
85-
final MutationOperation operation = mutationGroup.getSingleTableMutation()
86-
.createMutationOperation( valuesAnalysis, factory() );
85+
final MutationOperation operation = createOperation( valuesAnalysis, mutationGroup.getSingleTableMutation() );
8786
return operation == null
8887
? MutationOperationGroupFactory.noOperations( mutationGroup )
8988
: MutationOperationGroupFactory.singleOperation( mutationGroup, operation );
@@ -116,6 +115,13 @@ protected MutationOperationGroup createOperationGroup(ValuesAnalysis valuesAnaly
116115
}
117116
}
118117

118+
/*
119+
* Used by Hibernate Reactive
120+
*/
121+
protected MutationOperation createOperation(ValuesAnalysis valuesAnalysis, TableMutation<?> singleTableMutation) {
122+
return singleTableMutation.createMutationOperation( valuesAnalysis, factory() );
123+
}
124+
119125
protected void handleValueGeneration(
120126
AttributeMapping attributeMapping,
121127
MutationGroupBuilder mutationGroupBuilder,

hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/DeleteOrUpsertOperation.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public class DeleteOrUpsertOperation implements SelfExecutingUpdateOperation {
4444

4545
private final OptionalTableUpdate optionalTableUpdate;
4646

47-
4847
public DeleteOrUpsertOperation(
4948
EntityMutationTarget mutationTarget,
5049
EntityTableMapping tableMapping,
@@ -56,6 +55,16 @@ public DeleteOrUpsertOperation(
5655
this.optionalTableUpdate = optionalTableUpdate;
5756
}
5857

58+
/*
59+
* Used by Hibernate Reactive
60+
*/
61+
protected DeleteOrUpsertOperation(DeleteOrUpsertOperation original) {
62+
this.mutationTarget = original.mutationTarget;
63+
this.tableMapping = original.tableMapping;
64+
this.upsertOperation = original.upsertOperation;
65+
this.optionalTableUpdate = original.optionalTableUpdate;
66+
}
67+
5968
@Override
6069
public MutationType getMutationType() {
6170
return MutationType.UPDATE;
@@ -197,4 +206,18 @@ private void performUpsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
197206

198207
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upserted into `%s`", rowCount, tableMapping.getTableName() );
199208
}
209+
210+
/*
211+
* Used by Hibernate Reactive
212+
*/
213+
public UpsertOperation getUpsertOperation() {
214+
return upsertOperation;
215+
}
216+
217+
/*
218+
* Used by Hibernate Reactive
219+
*/
220+
public OptionalTableUpdate getOptionalTableUpdate() {
221+
return optionalTableUpdate;
222+
}
200223
}

hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,10 @@ private static void bindKeyValue(
263263
}
264264
}
265265

266-
private JdbcDeleteMutation createJdbcDelete(SharedSessionContractImplementor session) {
266+
/*
267+
* Used by Hibernate Reactive
268+
*/
269+
protected JdbcDeleteMutation createJdbcDelete(SharedSessionContractImplementor session) {
267270
final TableDelete tableDelete;
268271
if ( tableMapping.getDeleteDetails() != null
269272
&& tableMapping.getDeleteDetails().getCustomSql() != null ) {
@@ -305,39 +308,7 @@ private boolean performUpdate(
305308
JdbcValueBindings jdbcValueBindings,
306309
SharedSessionContractImplementor session) {
307310
MODEL_MUTATION_LOGGER.tracef( "#performUpdate(%s)", tableMapping.getTableName() );
308-
309-
final TableUpdate<JdbcMutationOperation> tableUpdate;
310-
if ( tableMapping.getUpdateDetails() != null
311-
&& tableMapping.getUpdateDetails().getCustomSql() != null ) {
312-
tableUpdate = new TableUpdateCustomSql(
313-
new MutatingTableReference( tableMapping ),
314-
mutationTarget,
315-
"upsert update for " + mutationTarget.getRolePath(),
316-
valueBindings,
317-
keyBindings,
318-
optimisticLockBindings,
319-
parameters
320-
);
321-
}
322-
else {
323-
tableUpdate = new TableUpdateStandard(
324-
new MutatingTableReference( tableMapping ),
325-
mutationTarget,
326-
"upsert update for " + mutationTarget.getRolePath(),
327-
valueBindings,
328-
keyBindings,
329-
optimisticLockBindings,
330-
parameters
331-
);
332-
}
333-
334-
final SqlAstTranslator<JdbcMutationOperation> translator = session
335-
.getJdbcServices()
336-
.getJdbcEnvironment()
337-
.getSqlAstTranslatorFactory()
338-
.buildModelMutationTranslator( tableUpdate, session.getFactory() );
339-
340-
final JdbcMutationOperation jdbcUpdate = translator.translate( null, MutationQueryOptions.INSTANCE );
311+
final JdbcMutationOperation jdbcUpdate = createJdbcUpdate( session );
341312

342313
final PreparedStatementGroupSingleTable statementGroup = new PreparedStatementGroupSingleTable( jdbcUpdate, session );
343314
final PreparedStatementDetails statementDetails = statementGroup.resolvePreparedStatementDetails( tableMapping.getTableName() );
@@ -374,6 +345,44 @@ private boolean performUpdate(
374345
}
375346
}
376347

348+
/*
349+
* Used by Hibernate Reactive
350+
*/
351+
protected JdbcMutationOperation createJdbcUpdate(SharedSessionContractImplementor session) {
352+
final TableUpdate<JdbcMutationOperation> tableUpdate;
353+
if ( tableMapping.getUpdateDetails() != null
354+
&& tableMapping.getUpdateDetails().getCustomSql() != null ) {
355+
tableUpdate = new TableUpdateCustomSql(
356+
new MutatingTableReference( tableMapping ),
357+
mutationTarget,
358+
"upsert update for " + mutationTarget.getRolePath(),
359+
valueBindings,
360+
keyBindings,
361+
optimisticLockBindings,
362+
parameters
363+
);
364+
}
365+
else {
366+
tableUpdate = new TableUpdateStandard(
367+
new MutatingTableReference( tableMapping ),
368+
mutationTarget,
369+
"upsert update for " + mutationTarget.getRolePath(),
370+
valueBindings,
371+
keyBindings,
372+
optimisticLockBindings,
373+
parameters
374+
);
375+
}
376+
377+
final SqlAstTranslator<JdbcMutationOperation> translator = session
378+
.getJdbcServices()
379+
.getJdbcEnvironment()
380+
.getSqlAstTranslatorFactory()
381+
.buildModelMutationTranslator( tableUpdate, session.getFactory() );
382+
383+
return translator.translate( null, MutationQueryOptions.INSTANCE );
384+
}
385+
377386
private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) {
378387
final JdbcInsertMutation jdbcInsert = createJdbcInsert( session );
379388

@@ -414,7 +423,10 @@ private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
414423
}
415424
}
416425

417-
private JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor session) {
426+
/*
427+
* Used by Hibernate Reactive
428+
*/
429+
protected JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor session) {
418430
final TableInsert tableInsert;
419431
if ( tableMapping.getInsertDetails() != null
420432
&& tableMapping.getInsertDetails().getCustomSql() != null ) {

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,10 @@ public boolean isSelectByUniqueKey() {
142142
public DomainResultAssembler<?> createAssembler(
143143
InitializerParent<?> parent,
144144
AssemblerCreationState creationState) {
145-
final EntityInitializer<?> entityInitializer =
146-
creationState.resolveInitializer( this, parent, this )
147-
.asEntityInitializer();
145+
final EntityInitializer<?> entityInitializer = creationState.resolveInitializer( this, parent, this )
146+
.asEntityInitializer();
148147
assert entityInitializer != null;
149-
return new EntityAssembler<>( getFetchedMapping().getJavaType(), entityInitializer );
148+
return buildEntityAssembler( entityInitializer );
150149
}
151150

152151
@Override
@@ -160,4 +159,10 @@ public EntityInitializer<?> createInitializer(
160159
@Override
161160
public abstract EntityInitializer<?> createInitializer(InitializerParent<?> parent, AssemblerCreationState creationState);
162161

162+
/**
163+
* Used By Hibernate Reactive
164+
*/
165+
protected EntityAssembler<?> buildEntityAssembler(EntityInitializer<?> entityInitializer) {
166+
return new EntityAssembler<>( getFetchedMapping().getJavaType(), entityInitializer );
167+
}
163168
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,14 @@ public FetchParent getFetchParent() {
129129
public DomainResultAssembler<?> createAssembler(
130130
InitializerParent<?> parent,
131131
AssemblerCreationState creationState) {
132-
return new EntityAssembler<>( getFetchedMapping().getJavaType(),
133-
creationState.resolveInitializer( this, parent, this )
134-
.asEntityInitializer() );
132+
return buildEntityAssembler( creationState.resolveInitializer( this, parent, this ).asEntityInitializer() );
133+
}
134+
135+
/**
136+
* Used by Hibernate Reactive
137+
*/
138+
protected EntityAssembler<?> buildEntityAssembler(EntityInitializer<?> entityInitializer) {
139+
return new EntityAssembler<>( getFetchedMapping().getJavaType(), entityInitializer );
135140
}
136141

137142
@Override

hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,10 @@ private void populateTablesWithColumns(
638638
}
639639
}
640640

641-
private ColumnInformationImpl columnInformation(TableInformation tableInformation, ResultSet resultSet)
641+
/*
642+
* Hibernate Reactive overrides this
643+
*/
644+
protected ColumnInformationImpl columnInformation(TableInformation tableInformation, ResultSet resultSet)
642645
throws SQLException {
643646
return new ColumnInformationImpl(
644647
tableInformation,
@@ -864,7 +867,10 @@ protected void addColumns(TableInformation tableInformation) {
864867
}
865868
}
866869

867-
private Boolean interpretTruthValue(String nullable) {
870+
/*
871+
* Used by Hibernate Reactive
872+
*/
873+
protected Boolean interpretTruthValue(String nullable) {
868874
if ( "yes".equalsIgnoreCase( nullable ) ) {
869875
return Boolean.TRUE;
870876
}

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.List;
1414
import java.util.Map;
1515
import java.util.Set;
16+
import java.util.function.Function;
1617

1718
import org.hibernate.HibernateException;
1819
import org.hibernate.MappingException;
@@ -149,6 +150,18 @@ public EntityMetamodel(
149150
PersistentClass persistentClass,
150151
EntityPersister persister,
151152
RuntimeModelCreationContext creationContext) {
153+
this( persistentClass, persister, creationContext,
154+
rootName -> buildIdGenerator( rootName, persistentClass, creationContext ) );
155+
}
156+
157+
/*
158+
* Used by Hibernate Reactive to adapt the id generators
159+
*/
160+
public EntityMetamodel(
161+
PersistentClass persistentClass,
162+
EntityPersister persister,
163+
RuntimeModelCreationContext creationContext,
164+
Function<String, Generator> generatorSupplier) {
152165
this.sessionFactory = creationContext.getSessionFactory();
153166

154167
// Improves performance of EntityKey#equals by avoiding content check in String#equals
@@ -160,7 +173,7 @@ public EntityMetamodel(
160173

161174
subclassId = persistentClass.getSubclassId();
162175

163-
final Generator idgenerator = buildIdGenerator( persistentClass, creationContext );
176+
final Generator idgenerator = generatorSupplier.apply( rootName );
164177
identifierAttribute = PropertyFactory.buildIdentifierAttribute( persistentClass, idgenerator );
165178

166179
versioned = persistentClass.isVersioned();
@@ -483,7 +496,7 @@ private static boolean writePropertyValue(OnExecutionGenerator generator) {
483496
return writePropertyValue;
484497
}
485498

486-
private Generator buildIdGenerator(PersistentClass persistentClass, RuntimeModelCreationContext creationContext) {
499+
private static Generator buildIdGenerator(String rootName, PersistentClass persistentClass, RuntimeModelCreationContext creationContext) {
487500
final Generator existing = creationContext.getGenerators().get( rootName );
488501
if ( existing != null ) {
489502
return existing;

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/JsonArrayJdbcType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ protected <X> X fromString(String string, JavaType<X> javaType, WrapperOptions o
5959
if ( string == null ) {
6060
return null;
6161
}
62-
return JsonHelper.arrayFromString( javaType, this, string, options );
62+
return JsonHelper.arrayFromString( javaType, this.getElementJdbcType(), string, options );
6363
}
6464

6565
protected <X> String toString(X value, JavaType<X> javaType, WrapperOptions options) {

0 commit comments

Comments
 (0)