Skip to content

Commit 0bcd408

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 9f73610 commit 0bcd408

File tree

6 files changed

+65
-6
lines changed

6 files changed

+65
-6
lines changed

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

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

114+
public Identifier getLogicalValueColumnNameIdentifier() {
115+
return logicalValueColumnNameIdentifier;
116+
}
117+
114118
@Override
115119
public int getInitialValue() {
116120
return initialValue;

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,11 +469,29 @@ public abstract class AbstractEntityPersister
469469
private List<UniqueKeyEntry> uniqueKeyEntries = null; //lazily initialized
470470
private ConcurrentHashMap<String,SingleIdArrayLoadPlan> nonLazyPropertyLoadPlansByName;
471471

472+
public static class EntityMetamodelFactory {
473+
public EntityMetamodel createEntityMetamodel(
474+
PersistentClass persistentClass,
475+
EntityPersister persister,
476+
RuntimeModelCreationContext creationContext) {
477+
return new EntityMetamodel( persistentClass, persister, creationContext );
478+
}
479+
}
480+
472481
public AbstractEntityPersister(
473482
final PersistentClass persistentClass,
474483
final EntityDataAccess cacheAccessStrategy,
475484
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
476485
final RuntimeModelCreationContext creationContext) throws HibernateException {
486+
this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() );
487+
}
488+
489+
public AbstractEntityPersister(
490+
final PersistentClass persistentClass,
491+
final EntityDataAccess cacheAccessStrategy,
492+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
493+
final RuntimeModelCreationContext creationContext,
494+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
477495
this.jpaEntityName = persistentClass.getJpaEntityName();
478496

479497
//set it here, but don't call it, since it's still uninitialized!
@@ -500,7 +518,7 @@ public AbstractEntityPersister(
500518
isLazyPropertiesCacheable = true;
501519
}
502520

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

505523
entityEntryFactory = entityMetamodel.isMutable()
506524
? MutableEntityEntryFactory.INSTANCE

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,17 @@ 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+
public JoinedSubclassEntityPersister(
167+
final PersistentClass persistentClass,
168+
final EntityDataAccess cacheAccessStrategy,
169+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
170+
final RuntimeModelCreationContext creationContext,
171+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
163172

164-
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
173+
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory );
165174

166175
final Dialect dialect = creationContext.getDialect();
167176
final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry();

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,17 @@ 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+
public SingleTableEntityPersister(
121+
final PersistentClass persistentClass,
122+
final EntityDataAccess cacheAccessStrategy,
123+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
124+
final RuntimeModelCreationContext creationContext,
125+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
117126

118-
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext );
127+
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory );
119128

120129
final Dialect dialect = creationContext.getDialect();
121130
final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry();

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,16 @@ 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+
public UnionSubclassEntityPersister(
102+
final PersistentClass persistentClass,
103+
final EntityDataAccess cacheAccessStrategy,
104+
final NaturalIdDataAccess naturalIdRegionAccessStrategy,
105+
final RuntimeModelCreationContext creationContext,
106+
final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException {
107+
super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory );
99108

100109
validateGenerator();
101110

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

Lines changed: 12 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,15 @@ 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+
public EntityMetamodel(
158+
PersistentClass persistentClass,
159+
EntityPersister persister,
160+
RuntimeModelCreationContext creationContext,
161+
Function<String, Generator> generatorSupplier) {
152162
this.sessionFactory = creationContext.getSessionFactory();
153163

154164
// Improves performance of EntityKey#equals by avoiding content check in String#equals
@@ -160,7 +170,7 @@ public EntityMetamodel(
160170

161171
subclassId = persistentClass.getSubclassId();
162172

163-
final Generator idgenerator = buildIdGenerator( persistentClass, creationContext );
173+
final Generator idgenerator = generatorSupplier.apply( rootName );
164174
identifierAttribute = PropertyFactory.buildIdentifierAttribute( persistentClass, idgenerator );
165175

166176
versioned = persistentClass.isVersioned();
@@ -483,7 +493,7 @@ private static boolean writePropertyValue(OnExecutionGenerator generator) {
483493
return writePropertyValue;
484494
}
485495

486-
private Generator buildIdGenerator(PersistentClass persistentClass, RuntimeModelCreationContext creationContext) {
496+
private static Generator buildIdGenerator(String rootName, PersistentClass persistentClass, RuntimeModelCreationContext creationContext) {
487497
final Generator existing = creationContext.getGenerators().get( rootName );
488498
if ( existing != null ) {
489499
return existing;

0 commit comments

Comments
 (0)