Skip to content

HHH-19336 - Proper implementation for JPA extended locking scope #10166

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

sebersole
Copy link
Member

@sebersole sebersole commented May 16, 2025

HHH-19336 - Proper implementation for JPA extended locking scope
HHH-19459 - LockScope, FollowOnLocking

[Please describe here what your change is about]


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license
and can be relicensed under the terms of the LGPL v2.1 license in the future at the maintainers' discretion.
For more information on licensing, please check here.


https://hibernate.atlassian.net/browse/HHH-19336

HHH-19459 - LockScope, FollowOnLocking

# Conflicts:
#	hibernate-core/src/main/java/org/hibernate/LockOptions.java
Comment on lines +35 to +76
/**
* Lock the database row(s) that correspond to the non-collection-valued
* persistent state of that instance. If a joined inheritance strategy is
* used, or if the entity is otherwise mapped to a secondary table, this
* entails locking the row(s) for the entity instance in the additional table(s).
*
* @see PessimisticLockScope#NORMAL
*/
ROOT_ONLY( PessimisticLockScope.NORMAL ),

/**
* In addition to the locking behavior specified for {@linkplain #ROOT_ONLY},
* rows for collection tables ({@linkplain jakarta.persistence.ElementCollection},
* {@linkplain jakarta.persistence.OneToMany} and {@linkplain jakarta.persistence.ManyToMany})
* will also be locked.
*
* @see PessimisticLockScope#EXTENDED
*/
INCLUDE_COLLECTIONS( PessimisticLockScope.EXTENDED ),

/**
* All tables with fetched rows will be locked.
*
* @apiNote This is Hibernate's legacy behavior, and has no
* corresponding JPA scope.
*/
INCLUDE_FETCHES( null );

private final PessimisticLockScope jpaScope;

Scope(PessimisticLockScope jpaScope) {
this.jpaScope = jpaScope;
}

/**
* The JPA PessimisticLockScope which corresponds to this LockScope.
*
* @return The corresponding PessimisticLockScope, or {@code null}.
*/
public PessimisticLockScope getCorrespondingJpaScope() {
return jpaScope;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/**
* Lock the database row(s) that correspond to the non-collection-valued
* persistent state of that instance. If a joined inheritance strategy is
* used, or if the entity is otherwise mapped to a secondary table, this
* entails locking the row(s) for the entity instance in the additional table(s).
*
* @see PessimisticLockScope#NORMAL
*/
ROOT_ONLY( PessimisticLockScope.NORMAL ),
/**
* In addition to the locking behavior specified for {@linkplain #ROOT_ONLY},
* rows for collection tables ({@linkplain jakarta.persistence.ElementCollection},
* {@linkplain jakarta.persistence.OneToMany} and {@linkplain jakarta.persistence.ManyToMany})
* will also be locked.
*
* @see PessimisticLockScope#EXTENDED
*/
INCLUDE_COLLECTIONS( PessimisticLockScope.EXTENDED ),
/**
* All tables with fetched rows will be locked.
*
* @apiNote This is Hibernate's legacy behavior, and has no
* corresponding JPA scope.
*/
INCLUDE_FETCHES( null );
private final PessimisticLockScope jpaScope;
Scope(PessimisticLockScope jpaScope) {
this.jpaScope = jpaScope;
}
/**
* The JPA PessimisticLockScope which corresponds to this LockScope.
*
* @return The corresponding PessimisticLockScope, or {@code null}.
*/
public PessimisticLockScope getCorrespondingJpaScope() {
return jpaScope;
}
/**
* Lock the database row(s) that correspond to the non-collection-valued
* persistent state of that instance. If a joined inheritance strategy is
* used, or if the entity is otherwise mapped to a secondary table, this
* entails locking the row(s) for the entity instance in the additional table(s).
*
* @see PessimisticLockScope#NORMAL
*/
ROOT_ONLY,
/**
* In addition to the locking behavior specified for {@linkplain #ROOT_ONLY},
* rows for collection tables ({@linkplain jakarta.persistence.ElementCollection},
* {@linkplain jakarta.persistence.OneToMany} and {@linkplain jakarta.persistence.ManyToMany})
* will also be locked.
*
* @see PessimisticLockScope#EXTENDED
*/
INCLUDE_COLLECTIONS,
/**
* All tables with fetched rows will be locked.
*
* @apiNote This is Hibernate's legacy behavior, and has no
* corresponding JPA scope.
*/
INCLUDE_FETCHES;
/**
* The JPA PessimisticLockScope which corresponds to this LockScope.
*
* @return The corresponding PessimisticLockScope, or {@code null}.
*/
public PessimisticLockScope getCorrespondingJpaScope() {
return switch (this) {
case ROOT_ONLY -> PessimisticLockScope.NORMAL;
case INCLUDE_COLLECTIONS -> PessimisticLockScope.EXTENDED;
case INCLUDE_FETCHES -> null;
};
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants