@@ -70,16 +70,7 @@ else if ( hadOnExecutionGeneration ) {
7070 return createCompositeOnExecutionGenerator ();
7171 }
7272 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 ;
8374 }
8475 }
8576
@@ -89,6 +80,8 @@ private OnExecutionGenerator createCompositeOnExecutionGenerator() {
8980 // the base-line values for the aggregated OnExecutionGenerator we will build here.
9081 final EnumSet <EventType > eventTypes = EnumSet .noneOf (EventType .class );
9182 boolean referenceColumns = false ;
83+ boolean writable = false ;
84+ boolean mutable = false ;
9285 final String [] columnValues = new String [composite .getColumnSpan ()];
9386
9487 // start building the aggregate values
@@ -120,31 +113,16 @@ private OnExecutionGenerator createCompositeOnExecutionGenerator() {
120113 columnIndex += span ;
121114 }
122115 }
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 ;
131118 }
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 ;
141121 }
122+ }
142123
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 );
148126 }
149127
150128 private BeforeExecutionGenerator createCompositeBeforeExecutionGenerator () {
@@ -157,45 +135,98 @@ private BeforeExecutionGenerator createCompositeBeforeExecutionGenerator() {
157135 eventTypes .addAll ( generator .getEventTypes () );
158136 }
159137 }
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 );
177189 }
178- return descriptor .getRepresentationStrategy ().getInstantiator ()
179- .instantiate ( () -> generatedValues , session .getFactory () );
180190 }
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 );
190202 }
191- return currentValue ;
192203 }
204+ return currentValue ;
193205 }
206+ }
207+ }
194208
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+ }
200231 }
201232}
0 commit comments