Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -318,10 +318,7 @@ protected CompletionStage<Void> deleteEntity(
final DeleteContext transientEntities) {

if ( LOG.isTraceEnabled() ) {
LOG.tracev(
"Deleting {0}",
infoString( persister, entityEntry.getId(), session.getFactory() )
);
LOG.tracev( "Deleting {0}", infoString( persister, entityEntry.getId(), session.getFactory() ) );
}

final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
Expand All @@ -335,71 +332,62 @@ protected CompletionStage<Void> deleteEntity(
final Object[] deletedState = createDeletedState( persister, currentState, session );
entityEntry.setDeletedState( deletedState );

session.getInterceptor().onDelete(
entity,
entityEntry.getId(),
deletedState,
persister.getPropertyNames(),
propTypes
);
session.getInterceptor()
.onDelete( entity, entityEntry.getId(), deletedState, persister.getPropertyNames(), propTypes );

// before any callbacks, etc, so subdeletions see that this deletion happened first
persistenceContext.setEntryStatus( entityEntry, Status.DELETED );
final EntityKey key = session.generateEntityKey( entityEntry.getId(), persister );

CompletionStage<Void> beforeDelete = cascadeBeforeDelete( session, persister, entity, entityEntry, transientEntities );

CompletionStage<Void> nullifyAndAction = new ForeignKeys.Nullifier(
entity,
true,
false,
session,
persister
).nullifyTransientReferences( entityEntry.getDeletedState() )
.thenAccept( v -> {
new Nullability( session ).checkNullability(
entityEntry.getDeletedState(),
persister,
Nullability.NullabilityCheckType.DELETE
);
persistenceContext.registerNullifiableEntityKey( key );

ReactiveActionQueue actionQueue = actionQueue( session );

if ( isOrphanRemovalBeforeUpdates ) {
// TODO: The removeOrphan concept is a temporary "hack" for HHH-6484. This should be removed once action/task
// ordering is improved.
actionQueue.addAction(
new ReactiveOrphanRemovalAction(
entityEntry.getId(),
deletedState,
version,
entity,
persister,
isCascadeDeleteEnabled,
session
)
);
}
else {
// Ensures that containing deletions happen before sub-deletions
actionQueue.addAction(
new ReactiveEntityDeleteAction(
entityEntry.getId(),
deletedState,
version,
entity,
persister,
isCascadeDeleteEnabled,
session
)
);
}
} );

CompletionStage<Void> afterDelete = cascadeAfterDelete( session, persister, entity, transientEntities );

return beforeDelete.thenCompose( v -> nullifyAndAction ).thenCompose( v -> afterDelete );
return cascadeBeforeDelete( session, persister, entity, entityEntry, transientEntities )
.thenCompose( v -> new ForeignKeys.Nullifier(
entity,
true,
false,
session,
persister
).nullifyTransientReferences( entityEntry.getDeletedState() )
.thenAccept( vv -> {
new Nullability( session ).checkNullability(
entityEntry.getDeletedState(),
persister,
Nullability.NullabilityCheckType.DELETE
);
persistenceContext.registerNullifiableEntityKey( key );

ReactiveActionQueue actionQueue = actionQueue( session );

if ( isOrphanRemovalBeforeUpdates ) {
// TODO: The removeOrphan concept is a temporary "hack" for HHH-6484. This should be removed once action/task
// ordering is improved.
actionQueue.addAction(
new ReactiveOrphanRemovalAction(
entityEntry.getId(),
deletedState,
version,
entity,
persister,
isCascadeDeleteEnabled,
session
)
);
}
else {
// Ensures that containing deletions happen before sub-deletions
actionQueue.addAction(
new ReactiveEntityDeleteAction(
entityEntry.getId(),
deletedState,
version,
entity,
persister,
isCascadeDeleteEnabled,
session
)
);
}
} ) )
.thenCompose( v -> cascadeAfterDelete( session, persister, entity, transientEntities ) );
}

private ReactiveActionQueue actionQueue(EventSource session) {
Expand All @@ -409,7 +397,6 @@ private ReactiveActionQueue actionQueue(EventSource session) {
private Object[] createDeletedState(EntityPersister persister, Object[] currentState, EventSource session) {
Type[] propTypes = persister.getPropertyTypes();
final Object[] deletedState = new Object[propTypes.length];
// TypeFactory.deepCopy( currentState, propTypes, persister.getPropertyUpdateability(), deletedState, session );
boolean[] copyability = new boolean[propTypes.length];
java.util.Arrays.fill( copyability, true );
TypeHelper.deepCopy( currentState, propTypes, copyability, deletedState, session );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,15 @@

import java.util.Collection;
import java.util.List;
import jakarta.persistence.metamodel.Attribute;

import org.hibernate.reactive.it.lazytoone.Captain;
import org.hibernate.reactive.it.lazytoone.Ship;
import org.hibernate.reactive.mutiny.Mutiny;

import org.junit.Ignore;
import org.junit.Test;

import io.vertx.ext.unit.TestContext;
import jakarta.persistence.metamodel.Attribute;

import static org.assertj.core.api.Assertions.assertThat;

Expand All @@ -31,7 +30,6 @@ protected Collection<Class<?>> annotatedEntities() {
}

@Test
@Ignore //see https://github.com/hibernate/hibernate-reactive/issues/1517
public void testCascadeDelete(TestContext context) {
Captain robert = new Captain( "Robert Witterel" );
Ship obraDinn = new Ship( "Obra Dinn" );
Expand All @@ -57,7 +55,6 @@ public void testCascadeDelete(TestContext context) {
}

@Test
@Ignore //see https://github.com/hibernate/hibernate-reactive/issues/1517
public void testFetchOnChildSide(TestContext context) {
Captain robert = new Captain( "Robert Witterel" );
Ship obraDinn = new Ship( "Obra Dinn" );
Expand All @@ -83,7 +80,6 @@ public void testFetchOnChildSide(TestContext context) {
}

@Test
@Ignore //see https://github.com/hibernate/hibernate-reactive/issues/1517
public void testFetchOnParentSide(TestContext context) {
Captain robert = new Captain( "Robert Witterel" );
Ship obraDinn = new Ship( "Obra Dinn" );
Expand Down