Do not perform a version check on a non-existing entry when entry was deleted in the same session after being optimistically locked
Unit test provided
This commit is contained in:
parent
7ee941e13c
commit
3ee73a88b5
|
@ -55,6 +55,11 @@ public class EntityVerifyVersionProcess implements BeforeTransactionCompletionPr
|
||||||
public void doBeforeTransactionCompletion(SessionImplementor session) {
|
public void doBeforeTransactionCompletion(SessionImplementor session) {
|
||||||
final EntityPersister persister = entry.getPersister();
|
final EntityPersister persister = entry.getPersister();
|
||||||
|
|
||||||
|
if ( !entry.isExistsInDatabase() ) {
|
||||||
|
// HHH-9419: We cannot check for a version of an entry we ourselves deleted
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final Object latestVersion = persister.getCurrentVersion( entry.getId(), session );
|
final Object latestVersion = persister.getCurrentVersion( entry.getId(), session );
|
||||||
if ( !entry.getVersion().equals( latestVersion ) ) {
|
if ( !entry.getVersion().equals( latestVersion ) ) {
|
||||||
throw new OptimisticLockException(
|
throw new OptimisticLockException(
|
||||||
|
|
|
@ -293,6 +293,31 @@ public class QueryLockingTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
em.close();
|
em.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-9419")
|
||||||
|
public void testNoVersionCheckAfterRemove() {
|
||||||
|
EntityManager em = getOrCreateEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Lockable lock = new Lockable( "name" );
|
||||||
|
em.persist( lock );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
Integer initial = lock.getVersion();
|
||||||
|
assertNotNull( initial );
|
||||||
|
|
||||||
|
em = getOrCreateEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Lockable reread = em.createQuery( "from Lockable", Lockable.class )
|
||||||
|
.setLockMode( LockModeType.OPTIMISTIC )
|
||||||
|
.getSingleResult();
|
||||||
|
assertEquals( initial, reread.getVersion() );
|
||||||
|
assertTrue( em.unwrap( SessionImpl.class ).getActionQueue().hasBeforeTransactionActions() );
|
||||||
|
em.remove( reread );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
assertEquals( initial, reread.getVersion() );
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOptimisticSpecific() {
|
public void testOptimisticSpecific() {
|
||||||
EntityManager em = getOrCreateEntityManager();
|
EntityManager em = getOrCreateEntityManager();
|
||||||
|
|
Loading…
Reference in New Issue