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.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.LockModeType;
|
||||||
|
import javax.persistence.NamedQuery;
|
||||||
|
import javax.persistence.QueryHint;
|
||||||
import javax.persistence.Version;
|
import javax.persistence.Version;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
*/
|
*/
|
||||||
@Entity(name="Lock_")
|
@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 {
|
public class Lock {
|
||||||
private Integer id;
|
private Integer id;
|
||||||
private Integer version;
|
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
|
@Test
|
||||||
@RequiresDialectFeature( value = DialectChecks.SupportSkipLocked.class )
|
@RequiresDialectFeature( value = DialectChecks.SupportSkipLocked.class )
|
||||||
public void testUpdateWithPessimisticReadLockSkipLocked() {
|
public void testUpdateWithPessimisticReadLockSkipLocked() {
|
||||||
|
|
Loading…
Reference in New Issue