Skip to content

Commit dd782ca

Browse files
committed
HHH-18854 Allow changes to the id generator
Hibernate Reactive needs to replace or extends the original id generators. This changes make it possible to pass a function to the EntityMetamodel that allows Hibernate Reactive to replace the original id generators
1 parent d2b5612 commit dd782ca

File tree

6 files changed

+89
-6
lines changed

6 files changed

+89
-6
lines changed

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

+7
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/persister/entity/AbstractEntityPersister.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -469,11 +469,38 @@ public abstract class AbstractEntityPersister
469469
private List<UniqueKeyEntry> uniqueKeyEntries = null; //lazily initialized
470470
private ConcurrentHashMap<String,SingleIdArrayLoadPlan> nonLazyPropertyLoadPlansByName;
471471

472+
/**
473+
* A factory for the creation of an EntityMetamodel.
474+
* <p>
475+
* Hibernate Reactive uses it to pass its own entity metamodel class
476+
* and adapt the identifier generators.
477+
*/
478+
public static class EntityMetamodelFactory {
479+
public EntityMetamodel createEntityMetamodel(
480+
PersistentClass persistentClass,
481+
EntityPersister persister,
482+
RuntimeModelCreationContext creationContext) {
483+
return new EntityMetamodel( persistentClass, persister, creationContext );
484+
}
485+
}
486+
472487
public AbstractEntityPersister(
473488
final PersistentClass persistentClass,
474489
final EntityDataAccess cacheAccessStrategy,
475490
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
476491
final RuntimeModelCreationContext creationContext) throws HibernateException {
492+
this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() );
493+
}
494+
495+
/*
496+
* Used by Hibernate Reactive
497+
*/
498+
public AbstractEntityPersister(
499+
final PersistentClass persistentClass,
500+
final EntityDataAccess cacheAccessStrategy,
501+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
502+
final RuntimeModelCreationContext creationContext,
503+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
477504
this.jpaEntityName = persistentClass.getJpaEntityName();
478505

479506
//set it here, but don't call it, since it's still uninitialized!
@@ -500,7 +527,7 @@ public AbstractEntityPersister(
500527
isLazyPropertiesCacheable = true;
501528
}
502529

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

505532
entityEntryFactory = entityMetamodel.isMutable()
506533
? MutableEntityEntryFactory.INSTANCE

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,20 @@ public JoinedSubclassEntityPersister(
160160
final EntityDataAccess cacheAccessStrategy,
161161
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
162162
final RuntimeModelCreationContext creationContext) throws HibernateException {
163+
this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory());
164+
}
165+
166+
/*
167+
* Used by Hibernate Reactive
168+
*/
169+
public JoinedSubclassEntityPersister(
170+
final PersistentClass persistentClass,
171+
final EntityDataAccess cacheAccessStrategy,
172+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
173+
final RuntimeModelCreationContext creationContext,
174+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
163175

164-
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
176+
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory );
165177

166178
final Dialect dialect = creationContext.getDialect();
167179
final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry();

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,20 @@ public SingleTableEntityPersister(
114114
final EntityDataAccess cacheAccessStrategy,
115115
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
116116
final RuntimeModelCreationContext creationContext) throws HibernateException {
117+
this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() );
118+
}
119+
120+
/*
121+
* Used by Hibernate Reactive
122+
*/
123+
public SingleTableEntityPersister(
124+
final PersistentClass persistentClass,
125+
final EntityDataAccess cacheAccessStrategy,
126+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
127+
final RuntimeModelCreationContext creationContext,
128+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
117129

118-
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
130+
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory );
119131

120132
final Dialect dialect = creationContext.getDialect();
121133
final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry();

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,19 @@ public UnionSubclassEntityPersister(
9595
final EntityDataAccess cacheAccessStrategy,
9696
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
9797
final RuntimeModelCreationContext creationContext) throws HibernateException {
98-
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
98+
this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() );
99+
}
100+
101+
/*
102+
* Used by Hibernate Reactive
103+
*/
104+
public UnionSubclassEntityPersister(
105+
final PersistentClass persistentClass,
106+
final EntityDataAccess cacheAccessStrategy,
107+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
108+
final RuntimeModelCreationContext creationContext,
109+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
110+
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory );
99111

100112
validateGenerator();
101113

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

+15-2
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;

0 commit comments

Comments
 (0)