8
8
import java .util .function .Function ;
9
9
10
10
11
+ import org .hibernate .boot .model .relational .Database ;
12
+ import org .hibernate .boot .model .relational .SqlStringGenerationContext ;
11
13
import org .hibernate .generator .Generator ;
12
14
import org .hibernate .generator .GeneratorCreationContext ;
15
+ import org .hibernate .id .CompositeNestedGeneratedValueGenerator ;
13
16
import org .hibernate .id .Configurable ;
14
17
import org .hibernate .id .IdentifierGenerator ;
15
18
import org .hibernate .id .SelectGenerator ;
18
21
import org .hibernate .id .enhanced .SequenceStyleGenerator ;
19
22
import org .hibernate .id .enhanced .TableGenerator ;
20
23
import org .hibernate .id .enhanced .TableStructure ;
21
- import org .hibernate .mapping .GeneratorCreator ;
24
+ import org .hibernate .mapping .GeneratorSettings ;
22
25
import org .hibernate .mapping .PersistentClass ;
26
+ import org .hibernate .mapping .Property ;
27
+ import org .hibernate .mapping .RootClass ;
23
28
import org .hibernate .mapping .SimpleValue ;
24
29
import org .hibernate .metamodel .spi .RuntimeModelCreationContext ;
25
30
import org .hibernate .persister .entity .EntityPersister ;
26
31
import org .hibernate .reactive .id .ReactiveIdentifierGenerator ;
27
32
import org .hibernate .reactive .id .impl .EmulatedSequenceReactiveIdentifierGenerator ;
33
+ import org .hibernate .reactive .id .impl .ReactiveCompositeNestedGeneratedValueGenerator ;
28
34
import org .hibernate .reactive .id .impl .ReactiveGeneratorWrapper ;
29
35
import org .hibernate .reactive .id .impl .ReactiveSequenceIdentifierGenerator ;
30
36
import org .hibernate .reactive .id .impl .TableReactiveIdentifierGenerator ;
31
37
import org .hibernate .reactive .logging .impl .Log ;
38
+ import org .hibernate .service .ServiceRegistry ;
32
39
import org .hibernate .tuple .entity .EntityMetamodel ;
40
+ import org .hibernate .type .Type ;
33
41
34
42
import static java .lang .invoke .MethodHandles .lookup ;
35
43
import static org .hibernate .reactive .logging .impl .LoggerFactory .make ;
@@ -67,20 +75,22 @@ private static Generator buildIdGenerator(
67
75
return existing ;
68
76
}
69
77
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 (
79
81
creationContext .getDialect (),
80
82
persistentClass .getRootClass (),
81
83
persistentClass .getIdentifierProperty (),
82
84
creationContext .getGeneratorSettings ()
83
- );
85
+ ),
86
+ new IdGeneratorCreationContext (
87
+ persistentClass .getRootClass (),
88
+ persistentClass .getIdentifierProperty (),
89
+ creationContext .getGeneratorSettings (),
90
+ identifier ,
91
+ creationContext
92
+ ),
93
+ creationContext );
84
94
creationContext .getGenerators ().put ( rootName , idgenerator );
85
95
return idgenerator ;
86
96
}
@@ -90,8 +100,8 @@ public static Generator augmentWithReactiveGenerator(
90
100
Generator generator ,
91
101
GeneratorCreationContext creationContext ,
92
102
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 ();
95
105
if ( structure instanceof TableStructure ) {
96
106
return initialize ( (IdentifierGenerator ) generator , new EmulatedSequenceReactiveIdentifierGenerator ( (TableStructure ) structure , runtimeModelCreationContext ), creationContext );
97
107
}
@@ -100,16 +110,28 @@ public static Generator augmentWithReactiveGenerator(
100
110
}
101
111
throw LOG .unknownStructureType ();
102
112
}
103
- if ( generator instanceof TableGenerator ) {
113
+ if ( generator instanceof TableGenerator tableGenerator ) {
104
114
return initialize (
105
115
(IdentifierGenerator ) generator ,
106
- new TableReactiveIdentifierGenerator ( ( TableGenerator ) generator , runtimeModelCreationContext ),
116
+ new TableReactiveIdentifierGenerator ( tableGenerator , runtimeModelCreationContext ),
107
117
creationContext
108
118
);
109
119
}
110
120
if ( generator instanceof SelectGenerator ) {
111
121
throw LOG .selectGeneratorIsNotSupportedInHibernateReactive ();
112
122
}
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
+ }
113
135
//nothing to do
114
136
return generator ;
115
137
}
@@ -121,4 +143,57 @@ private static Generator initialize(
121
143
( (Configurable ) reactiveIdGenerator ).initialize ( creationContext .getSqlStringGenerationContext () );
122
144
return new ReactiveGeneratorWrapper ( reactiveIdGenerator , idGenerator );
123
145
}
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
+ }
124
199
}
0 commit comments