Skip to content

Commit 9ead62b

Browse files
gavinkingsebersole
authored andcommitted
HHH-18025 RefreshOptions and LockOptions
Signed-off-by: Gavin King <gavin@hibernate.org>
1 parent a7a2fac commit 9ead62b

File tree

3 files changed

+53
-10
lines changed

3 files changed

+53
-10
lines changed

hibernate-core/src/main/java/org/hibernate/LockMode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.hibernate;
88

99
import jakarta.persistence.FindOption;
10+
import jakarta.persistence.RefreshOption;
1011
import org.hibernate.jpa.internal.util.LockModeTypeHelper;
1112

1213
import jakarta.persistence.LockModeType;
@@ -43,7 +44,7 @@
4344
* @see LockOptions
4445
* @see org.hibernate.annotations.OptimisticLocking
4546
*/
46-
public enum LockMode implements FindOption {
47+
public enum LockMode implements FindOption, RefreshOption {
4748
/**
4849
* No lock required. If an object is requested with this lock
4950
* mode, a {@link #READ} lock will be obtained if it turns out

hibernate-core/src/main/java/org/hibernate/LockOptions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import jakarta.persistence.FindOption;
1818
import jakarta.persistence.PessimisticLockScope;
19+
import jakarta.persistence.RefreshOption;
1920
import org.hibernate.query.Query;
2021
import org.hibernate.query.spi.QueryOptions;
2122

@@ -52,7 +53,7 @@
5253
*
5354
* @author Scott Marlow
5455
*/
55-
public class LockOptions implements FindOption, Serializable {
56+
public class LockOptions implements FindOption, RefreshOption, Serializable {
5657
/**
5758
* Represents {@link LockMode#NONE}, to which timeout and scope are
5859
* not applicable.

hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2564,10 +2564,10 @@ public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode
25642564

25652565
private <T> IdentifierLoadAccessImpl<T> loadAccessWithOptions(Class<T> entityClass, FindOption[] options) {
25662566
final IdentifierLoadAccessImpl<T> loadAccess = byId(entityClass);
2567-
CacheStoreMode storeMode = null;
2568-
CacheRetrieveMode retrieveMode = null;
2567+
CacheStoreMode storeMode = getCacheStoreMode();
2568+
CacheRetrieveMode retrieveMode = getCacheRetrieveMode();
25692569
LockOptions lockOptions = new LockOptions();
2570-
for ( FindOption option : options) {
2570+
for ( FindOption option : options ) {
25712571
if ( option instanceof CacheStoreMode ) {
25722572
storeMode = (CacheStoreMode) option;
25732573
}
@@ -2591,7 +2591,7 @@ else if ( option instanceof Timeout ) {
25912591
lockOptions.setTimeOut( timeout.milliseconds() );
25922592
}
25932593
else if ( option instanceof EnabledFetchProfile ) {
2594-
EnabledFetchProfile enabledFetchProfile = (EnabledFetchProfile) option;
2594+
final EnabledFetchProfile enabledFetchProfile = (EnabledFetchProfile) option;
25952595
loadAccess.enableFetchProfile( enabledFetchProfile.profileName() );
25962596
}
25972597
else if ( option instanceof ReadOnlyMode ) {
@@ -2717,8 +2717,17 @@ public void lock(Object entity, LockModeType lockModeType, Map<String, Object> p
27172717

27182718
@Override
27192719
public void lock(Object entity, LockModeType lockMode, LockOption... options) {
2720-
// todo (jpa 3.2) : implement
2721-
throw new UnsupportedOperationException( "Not yet implemented" );
2720+
LockOptions lockOptions = new LockOptions( LockModeTypeHelper.getLockMode(lockMode) );
2721+
for ( LockOption option : options ) {
2722+
if ( option instanceof PessimisticLockScope ) {
2723+
lockOptions.setLockScope( (PessimisticLockScope) option );
2724+
}
2725+
else if ( option instanceof Timeout ) {
2726+
final Timeout timeout = (Timeout) option;
2727+
lockOptions.setTimeOut( timeout.milliseconds() );
2728+
}
2729+
}
2730+
lock( entity, lockOptions );
27222731
}
27232732

27242733
@Override
@@ -2768,8 +2777,40 @@ public void refresh(Object entity, LockModeType lockModeType, Map<String, Object
27682777

27692778
@Override
27702779
public void refresh(Object entity, RefreshOption... options) {
2771-
// todo (jpa 3.2) : implement
2772-
throw new UnsupportedOperationException( "Not yet implemented" );
2780+
CacheStoreMode storeMode = getCacheStoreMode();
2781+
LockOptions lockOptions = new LockOptions();
2782+
for ( RefreshOption option : options ) {
2783+
if ( option instanceof CacheStoreMode ) {
2784+
storeMode = (CacheStoreMode) option;
2785+
}
2786+
else if ( option instanceof LockModeType ) {
2787+
lockOptions.setLockMode( LockModeTypeHelper.getLockMode( (LockModeType) option ) );
2788+
}
2789+
else if ( option instanceof LockMode ) {
2790+
lockOptions.setLockMode( (LockMode) option );
2791+
}
2792+
else if ( option instanceof LockOptions ) {
2793+
lockOptions = (LockOptions) option;
2794+
}
2795+
else if ( option instanceof PessimisticLockScope ) {
2796+
lockOptions.setLockScope( (PessimisticLockScope) option );
2797+
}
2798+
else if ( option instanceof Timeout ) {
2799+
final Timeout timeout = (Timeout) option;
2800+
lockOptions.setTimeOut( timeout.milliseconds() );
2801+
}
2802+
}
2803+
2804+
final CacheMode previousCacheMode = getCacheMode();
2805+
if ( storeMode != null ) {
2806+
setCacheStoreMode( storeMode );
2807+
}
2808+
try {
2809+
refresh( entity, lockOptions );
2810+
}
2811+
finally {
2812+
setCacheMode( previousCacheMode );
2813+
}
27732814
}
27742815

27752816
private LockOptions buildLockOptions(LockModeType lockModeType, Map<String, Object> properties) {

0 commit comments

Comments
 (0)