@@ -70,16 +70,7 @@ else if ( hadOnExecutionGeneration ) {
70
70
return createCompositeOnExecutionGenerator ();
71
71
}
72
72
else {
73
- return new Generator () {
74
- @ Override
75
- public EnumSet <EventType > getEventTypes () {
76
- return NONE ;
77
- }
78
- @ Override
79
- public boolean generatedOnExecution () {
80
- return false ;
81
- }
82
- };
73
+ return DummyGenerator .INSTANCE ;
83
74
}
84
75
}
85
76
@@ -89,6 +80,8 @@ private OnExecutionGenerator createCompositeOnExecutionGenerator() {
89
80
// the base-line values for the aggregated OnExecutionGenerator we will build here.
90
81
final EnumSet <EventType > eventTypes = EnumSet .noneOf (EventType .class );
91
82
boolean referenceColumns = false ;
83
+ boolean writable = false ;
84
+ boolean mutable = false ;
92
85
final String [] columnValues = new String [composite .getColumnSpan ()];
93
86
94
87
// start building the aggregate values
@@ -120,31 +113,16 @@ private OnExecutionGenerator createCompositeOnExecutionGenerator() {
120
113
columnIndex += span ;
121
114
}
122
115
}
123
- }
124
- final boolean referenceColumnsInSql = referenceColumns ;
125
-
126
- // then use the aggregated values to build an OnExecutionGenerator
127
- return new OnExecutionGenerator () {
128
- @ Override
129
- public EnumSet <EventType > getEventTypes () {
130
- return eventTypes ;
116
+ if ( generator .writePropertyValue () ) {
117
+ writable = true ;
131
118
}
132
-
133
- @ Override
134
- public boolean referenceColumnsInSql (Dialect dialect ) {
135
- return referenceColumnsInSql ;
136
- }
137
-
138
- @ Override
139
- public String [] getReferencedColumnValues (Dialect dialect ) {
140
- return columnValues ;
119
+ if ( generator .allowMutation () ) {
120
+ mutable = true ;
141
121
}
122
+ }
142
123
143
- @ Override
144
- public boolean writePropertyValue () {
145
- return false ;
146
- }
147
- };
124
+ // then use the aggregated values to build an OnExecutionGenerator
125
+ return new CompositeOnExecutionGenerator ( eventTypes , referenceColumns , columnValues , writable , mutable );
148
126
}
149
127
150
128
private BeforeExecutionGenerator createCompositeBeforeExecutionGenerator () {
@@ -157,45 +135,98 @@ private BeforeExecutionGenerator createCompositeBeforeExecutionGenerator() {
157
135
eventTypes .addAll ( generator .getEventTypes () );
158
136
}
159
137
}
160
- return new BeforeExecutionGenerator () {
161
- @ Override
162
- public Object generate (SharedSessionContractImplementor session , Object owner , Object currentValue , EventType eventType ) {
163
- final EntityPersister persister = session .getEntityPersister ( entityName , owner );
164
- final int index = persister .getPropertyIndex ( mappingProperty .getName () );
165
- final EmbeddableMappingType descriptor =
166
- persister .getAttributeMapping (index ).asEmbeddedAttributeMapping ()
167
- .getEmbeddableTypeDescriptor ();
168
- final int size = properties .size ();
169
- if ( currentValue == null ) {
170
- final Object [] generatedValues = new Object [size ];
171
- for ( int i = 0 ; i < size ; i ++ ) {
172
- final Generator generator = generators .get (i );
173
- if ( generator != null ) {
174
- generatedValues [i ] = ((BeforeExecutionGenerator ) generator )
175
- .generate ( session , owner , null , eventType );
176
- }
138
+ return new CompositeBeforeExecutionGenerator ( entityName , generators , mappingProperty , properties , eventTypes );
139
+ }
140
+
141
+ private record CompositeOnExecutionGenerator (
142
+ EnumSet <EventType > eventTypes ,
143
+ boolean referenceColumnsInSql ,
144
+ String [] columnValues ,
145
+ boolean writePropertyValue ,
146
+ boolean allowMutation )
147
+ implements OnExecutionGenerator {
148
+ @ Override
149
+ public boolean referenceColumnsInSql (Dialect dialect ) {
150
+ return referenceColumnsInSql ;
151
+ }
152
+ @ Override
153
+ public String [] getReferencedColumnValues (Dialect dialect ) {
154
+ return columnValues ;
155
+ }
156
+
157
+ @ Override
158
+ public EnumSet <EventType > getEventTypes () {
159
+ return eventTypes ;
160
+ }
161
+ }
162
+
163
+ private record CompositeBeforeExecutionGenerator (
164
+ String entityName ,
165
+ List <Generator > generators ,
166
+ Property mappingProperty ,
167
+ List <Property > properties ,
168
+ EnumSet <EventType > eventTypes )
169
+ implements BeforeExecutionGenerator {
170
+ @ Override
171
+ public EnumSet <EventType > getEventTypes () {
172
+ return eventTypes ;
173
+ }
174
+ @ Override
175
+ public Object generate (SharedSessionContractImplementor session , Object owner , Object currentValue , EventType eventType ) {
176
+ final EntityPersister persister = session .getEntityPersister ( entityName , owner );
177
+ final int index = persister .getPropertyIndex ( mappingProperty .getName () );
178
+ final EmbeddableMappingType descriptor =
179
+ persister .getAttributeMapping ( index ).asEmbeddedAttributeMapping ()
180
+ .getEmbeddableTypeDescriptor ();
181
+ final int size = properties .size ();
182
+ if ( currentValue == null ) {
183
+ final Object [] generatedValues = new Object [size ];
184
+ for ( int i = 0 ; i < size ; i ++ ) {
185
+ final Generator generator = generators .get ( i );
186
+ if ( generator != null ) {
187
+ generatedValues [i ] = ((BeforeExecutionGenerator ) generator )
188
+ .generate ( session , owner , null , eventType );
177
189
}
178
- return descriptor .getRepresentationStrategy ().getInstantiator ()
179
- .instantiate ( () -> generatedValues , session .getFactory () );
180
190
}
181
- else {
182
- for ( int i = 0 ; i < size ; i ++ ) {
183
- final Generator generator = generators .get (i );
184
- if ( generator != null ) {
185
- final Object value = descriptor .getValue ( currentValue , i );
186
- final Object generatedValue = ((BeforeExecutionGenerator ) generator )
187
- .generate ( session , owner , value , eventType );
188
- descriptor .setValue ( currentValue , i , generatedValue );
189
- }
191
+ return descriptor .getRepresentationStrategy ().getInstantiator ()
192
+ .instantiate ( () -> generatedValues , session .getFactory () );
193
+ }
194
+ else {
195
+ for ( int i = 0 ; i < size ; i ++ ) {
196
+ final Generator generator = generators .get ( i );
197
+ if ( generator != null ) {
198
+ final Object value = descriptor .getValue ( currentValue , i );
199
+ final Object generatedValue = ((BeforeExecutionGenerator ) generator )
200
+ .generate ( session , owner , value , eventType );
201
+ descriptor .setValue ( currentValue , i , generatedValue );
190
202
}
191
- return currentValue ;
192
203
}
204
+ return currentValue ;
193
205
}
206
+ }
207
+ }
194
208
195
- @ Override
196
- public EnumSet <EventType > getEventTypes () {
197
- return eventTypes ;
198
- }
199
- };
209
+ private record DummyGenerator () implements Generator {
210
+ private static final Generator INSTANCE = new DummyGenerator ();
211
+
212
+ @ Override
213
+ public EnumSet <EventType > getEventTypes () {
214
+ return NONE ;
215
+ }
216
+
217
+ @ Override
218
+ public boolean generatedOnExecution () {
219
+ return false ;
220
+ }
221
+
222
+ @ Override
223
+ public boolean allowMutation () {
224
+ return true ;
225
+ }
226
+
227
+ @ Override
228
+ public boolean allowAssignedIdentifiers () {
229
+ return true ;
230
+ }
200
231
}
201
232
}
0 commit comments