Skip to content

Commit c6820d2

Browse files
committed
improve some locking-related error messages
1 parent 9cda810 commit c6820d2

9 files changed

+35
-41
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/lock/AbstractPessimisticUpdateLockingStrategy.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@
1010
import org.hibernate.StaleObjectStateException;
1111
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1212
import org.hibernate.persister.entity.EntityPersister;
13-
import org.hibernate.pretty.MessageHelper;
1413
import org.hibernate.sql.Update;
1514

1615
import java.sql.SQLException;
1716

18-
import static org.hibernate.internal.CoreMessageLogger.CORE_LOGGER;
17+
import static org.hibernate.pretty.MessageHelper.infoString;
1918

2019
/**
2120
* Common implementation of {@link PessimisticReadUpdateLockingStrategy}
@@ -39,13 +38,15 @@ public abstract class AbstractPessimisticUpdateLockingStrategy implements Lockin
3938
public AbstractPessimisticUpdateLockingStrategy(EntityPersister lockable, LockMode lockMode) {
4039
this.lockable = lockable;
4140
this.lockMode = lockMode;
42-
if ( !lockable.isVersioned() ) {
43-
CORE_LOGGER.writeLocksNotSupported( lockable.getEntityName() );
44-
this.sql = null;
41+
if ( lockMode.lessThan( LockMode.PESSIMISTIC_READ ) ) {
42+
throw new HibernateException( "Lock mode " + lockMode
43+
+ " not valid for locking via 'update' statement" );
4544
}
46-
else {
47-
this.sql = generateLockString();
45+
if ( !lockable.isVersioned() ) {
46+
throw new HibernateException( "Entity '" + lockable.getEntityName()
47+
+ "' has no version and may not be locked via 'update' statement" );
4848
}
49+
this.sql = generateLockString();
4950
}
5051

5152
@Override
@@ -54,14 +55,11 @@ public void lock(Object id, Object version, Object object, int timeout, SharedSe
5455
doLock( id, version, session );
5556
}
5657
catch (JDBCException e) {
57-
throw new PessimisticEntityLockException( object, "could not obtain pessimistic lock", e );
58+
throw new PessimisticEntityLockException( object, "Could not obtain pessimistic lock", e );
5859
}
5960
}
6061

6162
void doLock(Object id, Object version, SharedSessionContractImplementor session) {
62-
if ( !lockable.isVersioned() ) {
63-
throw new HibernateException( "write locks via update not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
64-
}
6563
try {
6664
final var factory = session.getFactory();
6765
final var jdbcCoordinator = session.getJdbcCoordinator();
@@ -100,7 +98,7 @@ void doLock(Object id, Object version, SharedSessionContractImplementor session)
10098
catch ( SQLException e ) {
10199
throw session.getJdbcServices().getSqlExceptionHelper().convert(
102100
e,
103-
"could not lock: " + MessageHelper.infoString( lockable, id, session.getFactory() ),
101+
"could not lock: " + infoString( lockable, id, session.getFactory() ),
104102
sql
105103
);
106104
}

hibernate-core/src/main/java/org/hibernate/dialect/lock/OptimisticForceIncrementLockingStrategy.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ public OptimisticForceIncrementLockingStrategy(EntityPersister lockable, LockMod
3434
this.lockable = lockable;
3535
this.lockMode = lockMode;
3636
if ( lockMode.lessThan( LockMode.OPTIMISTIC_FORCE_INCREMENT ) ) {
37-
throw new HibernateException( "[" + lockMode + "] not valid for [" + lockable.getEntityName() + "]" );
37+
throw new HibernateException( "Entity '" + lockable.getEntityName()
38+
+ "' may not be locked at level " + lockMode );
39+
}
40+
if ( !lockable.isVersioned() ) {
41+
throw new HibernateException( "Entity '" + lockable.getEntityName()
42+
+ "' has no version and may not be locked at level " + lockMode);
3843
}
3944
}
4045

4146
@Override
4247
public void lock(Object id, Object version, Object object, int timeout, EventSource session) {
43-
if ( !lockable.isVersioned() ) {
44-
throw new HibernateException( "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
45-
}
4648
// final EntityEntry entry = session.getPersistenceContextInternal().getEntry( object );
4749
// Register the EntityIncrementVersionProcess action to run just prior to transaction commit.
4850
session.getActionQueue().registerCallback( new EntityIncrementVersionProcess( object ) );

hibernate-core/src/main/java/org/hibernate/dialect/lock/OptimisticLockingStrategy.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,17 @@ public OptimisticLockingStrategy(EntityPersister lockable, LockMode lockMode) {
3333
this.lockable = lockable;
3434
this.lockMode = lockMode;
3535
if ( lockMode.lessThan( LockMode.OPTIMISTIC ) ) {
36-
throw new HibernateException( "[" + lockMode + "] not valid for [" + lockable.getEntityName() + "]" );
36+
throw new HibernateException( "Entity '" + lockable.getEntityName()
37+
+ "' may not be locked at level " + lockMode );
38+
}
39+
if ( !lockable.isVersioned() ) {
40+
throw new HibernateException( "Entity '" + lockable.getEntityName()
41+
+ "' has no version and may not be locked at level " + lockMode);
3742
}
3843
}
3944

4045
@Override
4146
public void lock(Object id, Object version, Object object, int timeout, EventSource session) {
42-
if ( !lockable.isVersioned() ) {
43-
throw new HibernateException( "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
44-
}
4547
// Register the EntityVerifyVersionProcess action to run just prior to transaction commit.
4648
session.getActionQueue().registerCallback( new EntityVerifyVersionProcess( object ) );
4749
}

hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticForceIncrementLockingStrategy.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ public PessimisticForceIncrementLockingStrategy(EntityPersister lockable, LockMo
3434
this.lockMode = lockMode;
3535
// ForceIncrement can be used for PESSIMISTIC_READ, PESSIMISTIC_WRITE or PESSIMISTIC_FORCE_INCREMENT
3636
if ( lockMode.lessThan( LockMode.PESSIMISTIC_READ ) ) {
37-
throw new HibernateException( "[" + lockMode + "] not valid for [" + lockable.getEntityName() + "]" );
37+
throw new HibernateException( "Entity '" + lockable.getEntityName()
38+
+ "' may not be locked at level " + lockMode );
39+
}
40+
if ( !lockable.isVersioned() ) {
41+
throw new HibernateException( "Entity '" + lockable.getEntityName()
42+
+ "' has no version and may not be locked at level " + lockMode);
3843
}
3944
}
4045

4146
@Override
4247
public void lock(Object id, Object version, Object object, int timeout, SharedSessionContractImplementor session) {
43-
if ( !lockable.isVersioned() ) {
44-
throw new HibernateException( "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
45-
}
4648
final var entry = session.getPersistenceContextInternal().getEntry( object );
4749
OptimisticLockHelper.forceVersionIncrement( object, entry, session );
4850
}

hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticReadUpdateLockingStrategy.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package org.hibernate.dialect.lock;
66

7-
import org.hibernate.HibernateException;
87
import org.hibernate.LockMode;
98
import org.hibernate.persister.entity.EntityPersister;
109

@@ -30,8 +29,5 @@ public class PessimisticReadUpdateLockingStrategy extends AbstractPessimisticUpd
3029
*/
3130
public PessimisticReadUpdateLockingStrategy(EntityPersister lockable, LockMode lockMode) {
3231
super( lockable, lockMode );
33-
if ( lockMode.lessThan( LockMode.PESSIMISTIC_READ ) ) {
34-
throw new HibernateException( "[" + lockMode + "] not valid for update statement" );
35-
}
3632
}
3733
}

hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteUpdateLockingStrategy.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package org.hibernate.dialect.lock;
66

7-
import org.hibernate.HibernateException;
87
import org.hibernate.LockMode;
98
import org.hibernate.persister.entity.EntityPersister;
109

@@ -29,8 +28,5 @@ public class PessimisticWriteUpdateLockingStrategy extends AbstractPessimisticUp
2928
*/
3029
public PessimisticWriteUpdateLockingStrategy(EntityPersister lockable, LockMode lockMode) {
3130
super( lockable, lockMode );
32-
if ( lockMode.lessThan( LockMode.PESSIMISTIC_READ ) ) {
33-
throw new HibernateException( "[" + lockMode + "] not valid for update statement" );
34-
}
3531
}
3632
}

hibernate-core/src/main/java/org/hibernate/dialect/lock/UpdateLockingStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class UpdateLockingStrategy extends AbstractPessimisticUpdateLockingStrat
3535
public UpdateLockingStrategy(EntityPersister lockable, LockMode lockMode) {
3636
super( lockable, lockMode );
3737
if ( lockMode.lessThan( LockMode.WRITE ) ) {
38-
throw new HibernateException( "[" + lockMode + "] not valid for update statement" );
38+
throw new HibernateException( "Lock mode " + lockMode + " not valid for locking via 'update' statement" );
3939
}
4040
}
4141

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultPostLoadEventListener.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,18 @@ public void onPostLoad(PostLoadEvent event) {
5151
OptimisticLockHelper.forceVersionIncrement( entity, entry, session );
5252
break;
5353
case OPTIMISTIC_FORCE_INCREMENT:
54-
session.getActionQueue().registerCallback( new EntityIncrementVersionProcess( entity ) );
54+
session.getActionQueue()
55+
.registerCallback( new EntityIncrementVersionProcess( entity ) );
5556
break;
5657
case OPTIMISTIC:
57-
session.getActionQueue().registerCallback( new EntityVerifyVersionProcess( entity ) );
58+
session.getActionQueue()
59+
.registerCallback( new EntityVerifyVersionProcess( entity ) );
5860
break;
5961
}
6062
}
6163
else {
62-
throw new HibernateException("[" + lockMode
63-
+ "] not supported for non-versioned entities [" + persister.getEntityName() + "]");
64+
throw new HibernateException( "Entity '" + persister.getEntityName()
65+
+ "' has no version and may not be locked at level " + lockMode);
6466
}
6567
}
6668
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,6 @@ void missingArguments(
270270
@Message(value = "Warnings creating temp table: %s", id = 413)
271271
void warningsCreatingTempTable(SQLWarning warning);
272272

273-
@LogMessage(level = WARN)
274-
@Message(value = "Write locks via update not supported for non-versioned entities [%s]", id = 416)
275-
void writeLocksNotSupported(String entityName);
276-
277273
@LogMessage(level = WARN)
278274
@Message(
279275
value = """

0 commit comments

Comments
 (0)