diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java index 091295f07581..3ff01b0ed31d 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java @@ -720,7 +720,7 @@ public LimitHandler getLimitHandler() { @Override public LockingSupport getLockingSupport() { - return H2LockingSupport.H2_LOCKING_SUPPORT; + return getVersion().isSameOrAfter( 2, 2, 220 ) ? H2LockingSupport.INSTANCE : H2LockingSupport.LEGACY_INSTANCE; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java index ef2f0a9256ac..05da7444be3f 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java @@ -671,7 +671,7 @@ public LimitHandler getLimitHandler() { @Override public LockingSupport getLockingSupport() { - return H2LockingSupport.H2_LOCKING_SUPPORT; + return getVersion().isSameOrAfter( 2, 2, 220 ) ? H2LockingSupport.INSTANCE : H2LockingSupport.LEGACY_INSTANCE; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/H2LockingSupport.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/H2LockingSupport.java index d69f56e327ad..b3e09d8ba7ff 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/H2LockingSupport.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/H2LockingSupport.java @@ -4,17 +4,31 @@ */ package org.hibernate.dialect.lock.internal; +import jakarta.persistence.Timeout; +import org.hibernate.Timeouts; import org.hibernate.dialect.lock.spi.ConnectionLockTimeoutStrategy; +import org.hibernate.dialect.lock.spi.LockTimeoutType; import org.hibernate.dialect.lock.spi.LockingSupport; import org.hibernate.dialect.lock.spi.OuterJoinLockingType; +import static org.hibernate.Timeouts.NO_WAIT_MILLI; +import static org.hibernate.Timeouts.SKIP_LOCKED_MILLI; +import static org.hibernate.dialect.lock.spi.LockTimeoutType.QUERY; + /** * LockingSupport for H2Dialect * * @author Steve Ebersole */ public class H2LockingSupport implements LockingSupport, LockingSupport.Metadata { - public static final H2LockingSupport H2_LOCKING_SUPPORT = new H2LockingSupport(); + public static final H2LockingSupport LEGACY_INSTANCE = new H2LockingSupport( false ); + public static final H2LockingSupport INSTANCE = new H2LockingSupport( true ); + + private final boolean supportsForUpdateOptions; + + private H2LockingSupport(boolean supportsForUpdateOptions) { + this.supportsForUpdateOptions = supportsForUpdateOptions; + } @Override public Metadata getMetadata() { @@ -26,6 +40,16 @@ public OuterJoinLockingType getOuterJoinLockingType() { return OuterJoinLockingType.IGNORED; } + @Override + public LockTimeoutType getLockTimeoutType(Timeout timeout) { + return switch ( timeout.milliseconds() ) { + case NO_WAIT_MILLI -> supportsForUpdateOptions ? QUERY : LockTimeoutType.NONE; + case SKIP_LOCKED_MILLI -> supportsForUpdateOptions ? QUERY : LockTimeoutType.NONE; + case Timeouts.WAIT_FOREVER_MILLI -> LockTimeoutType.QUERY; + default -> LockTimeoutType.NONE; + }; + } + @Override public ConnectionLockTimeoutStrategy getConnectionLockTimeoutStrategy() { // while we can set the `LOCK_TIMEOUT` setting, there seems to be