88import java .util .function .Function ;
99
1010
11+ import org .hibernate .boot .model .relational .Database ;
12+ import org .hibernate .boot .model .relational .SqlStringGenerationContext ;
1113import org .hibernate .generator .Generator ;
1214import org .hibernate .generator .GeneratorCreationContext ;
15+ import org .hibernate .id .CompositeNestedGeneratedValueGenerator ;
1316import org .hibernate .id .Configurable ;
1417import org .hibernate .id .IdentifierGenerator ;
1518import org .hibernate .id .SelectGenerator ;
1821import org .hibernate .id .enhanced .SequenceStyleGenerator ;
1922import org .hibernate .id .enhanced .TableGenerator ;
2023import org .hibernate .id .enhanced .TableStructure ;
21- import org .hibernate .mapping .GeneratorCreator ;
24+ import org .hibernate .mapping .GeneratorSettings ;
2225import org .hibernate .mapping .PersistentClass ;
26+ import org .hibernate .mapping .Property ;
27+ import org .hibernate .mapping .RootClass ;
2328import org .hibernate .mapping .SimpleValue ;
2429import org .hibernate .metamodel .spi .RuntimeModelCreationContext ;
2530import org .hibernate .persister .entity .EntityPersister ;
2631import org .hibernate .reactive .id .ReactiveIdentifierGenerator ;
2732import org .hibernate .reactive .id .impl .EmulatedSequenceReactiveIdentifierGenerator ;
33+ import org .hibernate .reactive .id .impl .ReactiveCompositeNestedGeneratedValueGenerator ;
2834import org .hibernate .reactive .id .impl .ReactiveGeneratorWrapper ;
2935import org .hibernate .reactive .id .impl .ReactiveSequenceIdentifierGenerator ;
3036import org .hibernate .reactive .id .impl .TableReactiveIdentifierGenerator ;
3137import org .hibernate .reactive .logging .impl .Log ;
38+ import org .hibernate .service .ServiceRegistry ;
3239import org .hibernate .tuple .entity .EntityMetamodel ;
40+ import org .hibernate .type .Type ;
3341
3442import static java .lang .invoke .MethodHandles .lookup ;
3543import static org .hibernate .reactive .logging .impl .LoggerFactory .make ;
@@ -67,20 +75,22 @@ private static Generator buildIdGenerator(
6775 return existing ;
6876 }
6977 else {
70- SimpleValue identifier = (SimpleValue ) persistentClass .getIdentifier ();
71- GeneratorCreator customIdGeneratorCreator = identifier .getCustomIdGeneratorCreator ();
72- identifier .setCustomIdGeneratorCreator ( context -> {
73- Generator generator = customIdGeneratorCreator .createGenerator ( context );
74- return augmentWithReactiveGenerator ( generator , context , creationContext );
75- } );
76- final Generator idgenerator = identifier
77- // returns the cached Generator if it was already created
78- .createGenerator (
78+ final SimpleValue identifier = (SimpleValue ) persistentClass .getIdentifier ();
79+ final Generator idgenerator = augmentWithReactiveGenerator (
80+ identifier .createGenerator (
7981 creationContext .getDialect (),
8082 persistentClass .getRootClass (),
8183 persistentClass .getIdentifierProperty (),
8284 creationContext .getGeneratorSettings ()
83- );
85+ ),
86+ new IdGeneratorCreationContext (
87+ persistentClass .getRootClass (),
88+ persistentClass .getIdentifierProperty (),
89+ creationContext .getGeneratorSettings (),
90+ identifier ,
91+ creationContext
92+ ),
93+ creationContext );
8494 creationContext .getGenerators ().put ( rootName , idgenerator );
8595 return idgenerator ;
8696 }
@@ -90,8 +100,8 @@ public static Generator augmentWithReactiveGenerator(
90100 Generator generator ,
91101 GeneratorCreationContext creationContext ,
92102 RuntimeModelCreationContext runtimeModelCreationContext ) {
93- if ( generator instanceof SequenceStyleGenerator ) {
94- final DatabaseStructure structure = ( ( SequenceStyleGenerator ) generator ) .getDatabaseStructure ();
103+ if ( generator instanceof SequenceStyleGenerator sequenceStyleGenerator ) {
104+ final DatabaseStructure structure = sequenceStyleGenerator .getDatabaseStructure ();
95105 if ( structure instanceof TableStructure ) {
96106 return initialize ( (IdentifierGenerator ) generator , new EmulatedSequenceReactiveIdentifierGenerator ( (TableStructure ) structure , runtimeModelCreationContext ), creationContext );
97107 }
@@ -100,16 +110,28 @@ public static Generator augmentWithReactiveGenerator(
100110 }
101111 throw LOG .unknownStructureType ();
102112 }
103- if ( generator instanceof TableGenerator ) {
113+ if ( generator instanceof TableGenerator tableGenerator ) {
104114 return initialize (
105115 (IdentifierGenerator ) generator ,
106- new TableReactiveIdentifierGenerator ( ( TableGenerator ) generator , runtimeModelCreationContext ),
116+ new TableReactiveIdentifierGenerator ( tableGenerator , runtimeModelCreationContext ),
107117 creationContext
108118 );
109119 }
110120 if ( generator instanceof SelectGenerator ) {
111121 throw LOG .selectGeneratorIsNotSupportedInHibernateReactive ();
112122 }
123+ if ( generator instanceof CompositeNestedGeneratedValueGenerator compositeNestedGeneratedValueGenerator ) {
124+ final ReactiveCompositeNestedGeneratedValueGenerator reactiveCompositeNestedGeneratedValueGenerator = new ReactiveCompositeNestedGeneratedValueGenerator (
125+ compositeNestedGeneratedValueGenerator ,
126+ creationContext ,
127+ runtimeModelCreationContext
128+ );
129+ return initialize (
130+ (IdentifierGenerator ) generator ,
131+ reactiveCompositeNestedGeneratedValueGenerator ,
132+ creationContext
133+ );
134+ }
113135 //nothing to do
114136 return generator ;
115137 }
@@ -121,4 +143,57 @@ private static Generator initialize(
121143 ( (Configurable ) reactiveIdGenerator ).initialize ( creationContext .getSqlStringGenerationContext () );
122144 return new ReactiveGeneratorWrapper ( reactiveIdGenerator , idGenerator );
123145 }
146+
147+ private record IdGeneratorCreationContext (
148+ RootClass rootClass ,
149+ Property property ,
150+ GeneratorSettings defaults ,
151+ SimpleValue identifier ,
152+ RuntimeModelCreationContext buildingContext ) implements GeneratorCreationContext {
153+
154+ @ Override
155+ public Database getDatabase () {
156+ return buildingContext .getBootModel ().getDatabase ();
157+ }
158+
159+ @ Override
160+ public ServiceRegistry getServiceRegistry () {
161+ return buildingContext .getBootstrapContext ().getServiceRegistry ();
162+ }
163+
164+ @ Override
165+ public SqlStringGenerationContext getSqlStringGenerationContext () {
166+ return defaults .getSqlStringGenerationContext ();
167+ }
168+
169+ @ Override
170+ public String getDefaultCatalog () {
171+ return defaults .getDefaultCatalog ();
172+ }
173+
174+ @ Override
175+ public String getDefaultSchema () {
176+ return defaults .getDefaultSchema ();
177+ }
178+
179+ @ Override
180+ public RootClass getRootClass () {
181+ return rootClass ;
182+ }
183+
184+ @ Override
185+ public PersistentClass getPersistentClass () {
186+ return rootClass ;
187+ }
188+
189+ @ Override
190+ public Property getProperty () {
191+ return property ;
192+ }
193+
194+ @ Override
195+ public Type getType () {
196+ return identifier .getType ();
197+ }
198+ }
124199}
0 commit comments