diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java index 62d0b283f6..9a8beb4d0b 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java @@ -12,7 +12,6 @@ import java.sql.Types; import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.Map; import java.util.TimeZone; @@ -639,12 +638,9 @@ public class CockroachLegacyDialect extends Dialect { */ if ( aliases.isEmpty() ) { LockMode lockMode = lockOptions.getLockMode(); - final Iterator> itr = lockOptions.getAliasLockIterator(); - while ( itr.hasNext() ) { + for ( Map.Entry entry : lockOptions.getAliasSpecificLocks() ) { // seek the highest lock mode - final Map.Entry entry = itr.next(); - final LockMode lm = entry.getValue(); - if ( lm.greaterThan( lockMode ) ) { + if ( entry.getValue().greaterThan(lockMode) ) { aliases = entry.getKey(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/LockOptions.java b/hibernate-core/src/main/java/org/hibernate/LockOptions.java index 9641053891..a752502bb4 100644 --- a/hibernate-core/src/main/java/org/hibernate/LockOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/LockOptions.java @@ -34,7 +34,6 @@ public class LockOptions implements Serializable { /** * Represents LockMode.UPGRADE (will wait forever for lock and scope of false meaning only entity is locked). */ - @SuppressWarnings("deprecation") public static final LockOptions UPGRADE = new LockOptions(LockMode.PESSIMISTIC_WRITE); /** @@ -198,7 +197,9 @@ public class LockOptions implements Serializable { * Iterator for accessing Alias (key) and LockMode (value) as Map.Entry. * * @return Iterator for accessing the Map.Entry's + * @deprecated use {@link #getAliasSpecificLocks()} */ + @Deprecated public Iterator> getAliasLockIterator() { return getAliasSpecificLocks().iterator(); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java index 56826dd7ba..5f06a3e8c1 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java @@ -38,7 +38,6 @@ import java.sql.CallableStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; -import java.util.Iterator; import java.util.Map; import static org.hibernate.type.SqlTypes.*; @@ -219,14 +218,11 @@ public abstract class AbstractTransactSQLDialect extends Dialect { @Override public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map keyColumnNames) { // TODO: merge additional lock options support in Dialect.applyLocksToSql - final Iterator itr = aliasedLockOptions.getAliasLockIterator(); final StringBuilder buffer = new StringBuilder( sql ); - - while ( itr.hasNext() ) { - final Map.Entry entry = (Map.Entry) itr.next(); - final LockMode lockMode = (LockMode) entry.getValue(); + for ( Map.Entry entry: aliasedLockOptions.getAliasSpecificLocks() ) { + final LockMode lockMode = entry.getValue(); if ( lockMode.greaterThan( LockMode.READ ) ) { - final String alias = (String) entry.getKey(); + final String alias = entry.getKey(); int start = -1; int end = -1; if ( sql.endsWith( " " + alias ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java index 268c19f5b8..0dad42b95b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java @@ -12,7 +12,6 @@ import java.sql.Types; import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.Map; import java.util.TimeZone; @@ -636,12 +635,9 @@ public class CockroachDialect extends Dialect { */ if ( aliases.isEmpty() ) { LockMode lockMode = lockOptions.getLockMode(); - final Iterator> itr = lockOptions.getAliasLockIterator(); - while ( itr.hasNext() ) { + for ( Map.Entry entry : lockOptions.getAliasSpecificLocks() ) { // seek the highest lock mode - final Map.Entry entry = itr.next(); - final LockMode lm = entry.getValue(); - if ( lm.greaterThan( lockMode ) ) { + if ( entry.getValue().greaterThan(lockMode) ) { aliases = entry.getKey(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java index 7fee0eb248..f5c827b556 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java @@ -1821,12 +1821,10 @@ public abstract class Dialect implements ConversionContext { */ public String getForUpdateString(String aliases, LockOptions lockOptions) { LockMode lockMode = lockOptions.getLockMode(); - final Iterator> itr = lockOptions.getAliasLockIterator(); - while ( itr.hasNext() ) { + for ( Map.Entry entry : lockOptions.getAliasSpecificLocks() ) { // seek the highest lock mode - final Map.Entryentry = itr.next(); final LockMode lm = entry.getValue(); - if ( lm.greaterThan( lockMode ) ) { + if ( lm.greaterThan(lockMode) ) { lockMode = lm; } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java index 802c4c512d..3806416bf0 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java @@ -14,9 +14,7 @@ import java.sql.Types; import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.TimeZone; import jakarta.persistence.TemporalType; @@ -636,12 +634,9 @@ public class PostgreSQLDialect extends Dialect { */ if ( aliases.isEmpty() ) { LockMode lockMode = lockOptions.getLockMode(); - final Iterator> itr = lockOptions.getAliasLockIterator(); - while ( itr.hasNext() ) { + for ( Map.Entry entry : lockOptions.getAliasSpecificLocks() ) { // seek the highest lock mode - final Map.Entry entry = itr.next(); - final LockMode lm = entry.getValue(); - if ( lm.greaterThan( lockMode ) ) { + if ( entry.getValue().greaterThan(lockMode) ) { aliases = entry.getKey(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ForUpdateFragment.java b/hibernate-core/src/main/java/org/hibernate/sql/ForUpdateFragment.java index 2b6b552f60..d53a94b228 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ForUpdateFragment.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ForUpdateFragment.java @@ -6,7 +6,6 @@ */ package org.hibernate.sql; -import java.util.Iterator; import java.util.Map; import org.hibernate.LockMode; @@ -27,38 +26,37 @@ public class ForUpdateFragment { public ForUpdateFragment(Dialect dialect, LockOptions lockOptions, Map keyColumnNames) throws QueryException { this.dialect = dialect; LockMode upgradeType = null; - Iterator> iter = lockOptions.getAliasLockIterator(); this.lockOptions = lockOptions; - if ( !iter.hasNext()) { // no tables referenced + if ( !lockOptions.getAliasSpecificLocks().iterator().hasNext() ) { // no tables referenced final LockMode lockMode = lockOptions.getLockMode(); - if ( LockMode.READ.lessThan( lockMode ) ) { + if ( LockMode.READ.lessThan(lockMode) ) { upgradeType = lockMode; } } - - while ( iter.hasNext() ) { - final Map.Entry me = iter.next(); - final LockMode lockMode = me.getValue(); - if ( LockMode.READ.lessThan( lockMode ) ) { - final String tableAlias = me.getKey(); - if ( dialect.getWriteRowLockStrategy() == RowLockStrategy.COLUMN ) { - String[] keyColumns = keyColumnNames.get( tableAlias ); //use the id column alias - if ( keyColumns == null ) { - throw new IllegalArgumentException( "alias not found: " + tableAlias ); + else { + for ( Map.Entry me : lockOptions.getAliasSpecificLocks() ) { + final LockMode lockMode = me.getValue(); + if ( LockMode.READ.lessThan(lockMode) ) { + final String tableAlias = me.getKey(); + if ( dialect.getWriteRowLockStrategy() == RowLockStrategy.COLUMN ) { + String[] keyColumns = keyColumnNames.get( tableAlias ); //use the id column alias + if ( keyColumns == null ) { + throw new IllegalArgumentException( "alias not found: " + tableAlias ); + } + keyColumns = StringHelper.qualify( tableAlias, keyColumns ); + for ( String keyColumn : keyColumns ) { + addTableAlias( keyColumn ); + } } - keyColumns = StringHelper.qualify( tableAlias, keyColumns ); - for ( String keyColumn : keyColumns ) { - addTableAlias( keyColumn ); + else { + addTableAlias( tableAlias ); } + if ( upgradeType != null && lockMode != upgradeType ) { + throw new QueryException( "mixed LockModes" ); + } + upgradeType = lockMode; } - else { - addTableAlias( tableAlias ); - } - if ( upgradeType != null && lockMode != upgradeType ) { - throw new QueryException( "mixed LockModes" ); - } - upgradeType = lockMode; } } }