@@ -253,12 +253,11 @@ protected CompletionStage<Void> entityIsTransient(MergeEvent event, MergeContext
253
253
// copy created before we actually copy
254
254
//cascadeOnMerge(event, persister, entity, copyCache, Cascades.CASCADE_BEFORE_MERGE);
255
255
return super .cascadeBeforeSave ( session , persister , entity , copyCache )
256
- .thenAccept ( v -> copyValues ( persister , entity , copy , session , copyCache , FROM_PARENT ) )
256
+ .thenCompose ( v -> copyValues ( persister , entity , copy , session , copyCache , FROM_PARENT ) )
257
257
.thenCompose ( v -> saveTransientEntity ( copy , entityName , event .getRequestedId (), session , copyCache ) )
258
258
.thenCompose ( v -> super .cascadeAfterSave ( session , persister , entity , copyCache ) )
259
+ .thenCompose ( v -> copyValues ( persister , entity , copy , session , copyCache , TO_PARENT ) )
259
260
.thenAccept ( v -> {
260
- copyValues ( persister , entity , copy , session , copyCache , TO_PARENT );
261
-
262
261
event .setResult (copy );
263
262
264
263
if (copy instanceof PersistentAttributeInterceptable ) {
@@ -280,12 +279,9 @@ private CompletionStage<Void> saveTransientEntity(
280
279
//this bit is only *really* absolutely necessary for handling
281
280
//requestedId, but is also good if we merge multiple object
282
281
//graphs, since it helps ensure uniqueness
283
- if ( requestedId == null ) {
284
- return reactiveSaveWithGeneratedId ( entity , entityName , copyCache , source , false );
285
- }
286
- else {
287
- return reactiveSaveWithRequestedId ( entity , requestedId , entityName , copyCache , source );
288
- }
282
+ return requestedId == null
283
+ ? reactiveSaveWithGeneratedId ( entity , entityName , copyCache , source , false )
284
+ : reactiveSaveWithRequestedId ( entity , requestedId , entityName , copyCache , source );
289
285
}
290
286
291
287
protected CompletionStage <Void > entityIsDetached (MergeEvent event , MergeContext copyCache ) {
@@ -414,10 +410,11 @@ private void markInterceptorDirty(final Object entity, final Object target, Enti
414
410
// for enhanced entities, copy over the dirty attributes
415
411
if ( entity instanceof SelfDirtinessTracker && target instanceof SelfDirtinessTracker ) {
416
412
// clear, because setting the embedded attributes dirties them
417
- ( (SelfDirtinessTracker ) target ).$$_hibernate_clearDirtyAttributes ();
418
-
419
- for ( String fieldName : ( (SelfDirtinessTracker ) entity ).$$_hibernate_getDirtyAttributes () ) {
420
- ( (SelfDirtinessTracker ) target ).$$_hibernate_trackChange ( fieldName );
413
+ SelfDirtinessTracker entityTracker = (SelfDirtinessTracker ) entity ;
414
+ SelfDirtinessTracker targetTracker = (SelfDirtinessTracker ) target ;
415
+ targetTracker .$$_hibernate_clearDirtyAttributes ();
416
+ for ( String fieldName : entityTracker .$$_hibernate_getDirtyAttributes () ) {
417
+ targetTracker .$$_hibernate_trackChange ( fieldName );
421
418
}
422
419
}
423
420
}
@@ -504,21 +501,19 @@ protected CompletionStage<Void> copyValues(
504
501
).thenAccept ( copiedValues -> persister .setPropertyValues ( target , copiedValues ) );
505
502
}
506
503
507
- protected void copyValues (
504
+ protected CompletionStage < Void > copyValues (
508
505
final EntityPersister persister ,
509
506
final Object entity ,
510
507
final Object target ,
511
508
final SessionImplementor source ,
512
509
final MergeContext copyCache ,
513
510
final ForeignKeyDirection foreignKeyDirection ) {
514
511
515
- final Object [] copiedValues ;
516
-
517
512
if ( foreignKeyDirection == TO_PARENT ) {
518
513
// this is the second pass through on a merge op, so here we limit the
519
514
// replacement to associations types (value types were already replaced
520
515
// during the first pass)
521
- copiedValues = TypeHelper .replaceAssociations (
516
+ Object [] copiedValues = TypeHelper .replaceAssociations (
522
517
persister .getPropertyValues ( entity ),
523
518
persister .getPropertyValues ( target ),
524
519
persister .getPropertyTypes (),
@@ -527,20 +522,20 @@ protected void copyValues(
527
522
copyCache ,
528
523
foreignKeyDirection
529
524
);
525
+ persister .setPropertyValues ( target , copiedValues );
526
+ return voidFuture ();
530
527
}
531
528
else {
532
- copiedValues = TypeHelper .replace (
529
+ return EntityTypes .replace (
533
530
persister .getPropertyValues ( entity ),
534
531
persister .getPropertyValues ( target ),
535
532
persister .getPropertyTypes (),
536
533
source ,
537
534
target ,
538
535
copyCache ,
539
536
foreignKeyDirection
540
- );
537
+ ). thenAccept ( copiedValues -> persister . setPropertyValues ( target , copiedValues ) ) ;
541
538
}
542
-
543
- persister .setPropertyValues ( target , copiedValues );
544
539
}
545
540
546
541
/**
@@ -576,17 +571,15 @@ protected CascadingAction<MergeContext> getCascadeReactiveAction() {
576
571
* Cascade behavior is redefined by this subclass, disable superclass behavior
577
572
*/
578
573
@ Override
579
- protected CompletionStage <Void > cascadeAfterSave (EventSource source , EntityPersister persister , Object entity , MergeContext anything )
580
- throws HibernateException {
574
+ protected CompletionStage <Void > cascadeAfterSave (EventSource source , EntityPersister persister , Object entity , MergeContext anything ) {
581
575
return voidFuture ();
582
576
}
583
577
584
578
/**
585
579
* Cascade behavior is redefined by this subclass, disable superclass behavior
586
580
*/
587
581
@ Override
588
- protected CompletionStage <Void > cascadeBeforeSave (EventSource source , EntityPersister persister , Object entity , MergeContext anything )
589
- throws HibernateException {
582
+ protected CompletionStage <Void > cascadeBeforeSave (EventSource source , EntityPersister persister , Object entity , MergeContext anything ) {
590
583
return voidFuture ();
591
584
}
592
585
0 commit comments