Skip to content

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;
};
}

@sebersole
Copy link
Member Author

Applied this work manually

@sebersole sebersole closed this Jul 29, 2025
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