Handling JPA Map storage case when parent has been deleted
Closes #10033
This commit is contained in:
parent
f78b8bf89f
commit
de7be3d65d
1 changed files with 9 additions and 1 deletions
|
@ -28,6 +28,7 @@ import org.hibernate.event.spi.PreUpdateEventListener;
|
||||||
import org.keycloak.models.map.storage.jpa.JpaChildEntity;
|
import org.keycloak.models.map.storage.jpa.JpaChildEntity;
|
||||||
|
|
||||||
import javax.persistence.LockModeType;
|
import javax.persistence.LockModeType;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen on changes on child entities and forces an optimistic locking increment on the topmost parent aka root.
|
* Listen on changes on child entities and forces an optimistic locking increment on the topmost parent aka root.
|
||||||
|
@ -46,10 +47,17 @@ public class JpaOptimisticLockingListener implements PreInsertEventListener, Pre
|
||||||
Object root = entity;
|
Object root = entity;
|
||||||
while (root instanceof JpaChildEntity) {
|
while (root instanceof JpaChildEntity) {
|
||||||
root = ((JpaChildEntity<?>) entity).getParent();
|
root = ((JpaChildEntity<?>) entity).getParent();
|
||||||
|
Objects.requireNonNull(root, "children must always return their parent, never null");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// a session would not contain the entity if it has been deleted
|
||||||
|
// if the entity has been deleted JPA would throw an IllegalArgumentException with the message
|
||||||
|
// "entity not in the persistence context".
|
||||||
|
if (session.contains(root)) {
|
||||||
session.lock(root, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
|
session.lock(root, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreInsert(PreInsertEvent event) {
|
public boolean onPreInsert(PreInsertEvent event) {
|
||||||
|
|
Loading…
Reference in a new issue