HHH-13364 : Added a test using a named query
This commit is contained in:
parent
f62913ba1c
commit
800b60e648
|
@ -10,12 +10,21 @@ package org.hibernate.jpa.test.lock;
|
|||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.LockModeType;
|
||||
import javax.persistence.NamedQuery;
|
||||
import javax.persistence.QueryHint;
|
||||
import javax.persistence.Version;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity(name="Lock_")
|
||||
@NamedQuery(
|
||||
name="AllLocks",
|
||||
query="from Lock_",
|
||||
lockMode = LockModeType.PESSIMISTIC_WRITE,
|
||||
hints = { @QueryHint( name = "javax.persistence.lock.timeout", value = "0")}
|
||||
)
|
||||
public class Lock {
|
||||
private Integer id;
|
||||
private Integer version;
|
||||
|
|
|
@ -220,6 +220,50 @@ public class LockTest extends BaseEntityManagerFunctionalTestCase {
|
|||
} );
|
||||
}
|
||||
|
||||
@Test(timeout = 5 * 1000) //5 seconds
|
||||
@TestForIssue( jiraKey = "HHH-13364" )
|
||||
@RequiresDialectFeature( value = DialectChecks.SupportsLockTimeouts.class,
|
||||
comment = "Test verifies proper exception throwing when a lock timeout is specified for NamedQuery#getResultList.",
|
||||
jiraKey = "HHH-13364" )
|
||||
public void testNamedQueryResultListPessimisticWriteLockTimeoutException() {
|
||||
Lock lock = new Lock();
|
||||
lock.setName( "name" );
|
||||
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
entityManager.persist( lock );
|
||||
} );
|
||||
|
||||
doInJPA( this::entityManagerFactory, _entityManager -> {
|
||||
|
||||
Lock lock2 = _entityManager.find( Lock.class, lock.getId(), LockModeType.PESSIMISTIC_WRITE );
|
||||
assertEquals( "lock mode should be PESSIMISTIC_WRITE ", LockModeType.PESSIMISTIC_WRITE, _entityManager.getLockMode( lock2 ) );
|
||||
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
try {
|
||||
TransactionUtil.setJdbcTimeout( entityManager.unwrap( Session.class ) );
|
||||
entityManager.createNamedQuery( "AllLocks", Lock.class ).getResultList();
|
||||
fail( "Exception should be thrown" );
|
||||
}
|
||||
catch (LockTimeoutException lte) {
|
||||
// Proper exception thrown for dialect supporting lock timeouts when an immediate timeout is set.
|
||||
lte.getCause();
|
||||
}
|
||||
catch (PessimisticLockException pe) {
|
||||
fail( "Find with immediate timeout should have thrown LockTimeoutException." );
|
||||
}
|
||||
catch (PersistenceException pe) {
|
||||
log.info(
|
||||
"EntityManager.find() for PESSIMISTIC_WRITE with timeout of 0 threw a PersistenceException.\n" +
|
||||
"This is likely a consequence of " + getDialect().getClass()
|
||||
.getName() + " not properly mapping SQL errors into the correct HibernateException subtypes.\n" +
|
||||
"See HHH-7251 for an example of one such situation.", pe
|
||||
);
|
||||
fail( "EntityManager should be throwing LockTimeoutException." );
|
||||
}
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
@RequiresDialectFeature( value = DialectChecks.SupportSkipLocked.class )
|
||||
public void testUpdateWithPessimisticReadLockSkipLocked() {
|
||||
|
|
Loading…
Reference in New Issue