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:
Arcadiy Ivanov 2014-09-27 01:34:23 -04:00
parent 7ee941e13c
commit 3ee73a88b5
2 changed files with 30 additions and 0 deletions

View File

@ -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(

View File

@ -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();