HHH-11656 - Added test case.

This commit is contained in:
Chris Cranford 2017-09-29 11:27:34 -04:00
parent 85016e0bca
commit 05f8e7306e
1 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1,108 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.locking;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.LockModeType;
import javax.persistence.Version;
import org.hibernate.dialect.HANAColumnStoreDialect;
import org.hibernate.dialect.HANARowStoreDialect;
import org.junit.Test;
import org.hibernate.testing.RequiresDialect;
import org.hibernate.testing.RequiresDialects;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import static org.junit.Assert.assertNotNull;
/**
* @author Chris Cranford
*/
@TestForIssue(jiraKey = "HHH-11656")
@RequiresDialects( { @RequiresDialect(HANAColumnStoreDialect.class), @RequiresDialect(HANARowStoreDialect.class) })
public class HANAOptimisticLockingTest extends BaseCoreFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { SomeEntity.class };
}
@Test
public void testOptimisticLock() throws Exception {
testWithSpecifiedLockMode( LockModeType.OPTIMISTIC );
}
@Test
public void testOptimisticLockForceIncrement() throws Exception {
testWithSpecifiedLockMode( LockModeType.OPTIMISTIC_FORCE_INCREMENT );
}
private void testWithSpecifiedLockMode(LockModeType lockModeType) {
// makes sure we have an entity to actually query
final Object id = doInHibernate( this::sessionFactory, session -> {
return session.save( new SomeEntity() );
} );
// tests that both the query execution doesn't throw a SQL syntax (which is the main bug) and that
// the query returns an expected entity object.
doInHibernate( this::sessionFactory, session -> {
/**
* This generates the wrong SQL query for HANA.
* Using optimistic lock and string query cause a bug.
*
* Generated SQL query for HANA is as follows:
*
* SELECT
* someentity0_.id as id1_0_,
* someentity0_.version as version2_0_
* FROM SomeEntity someentity0_
* WHERE someentity0_ = 1 of someentity0_.id
*
* The exception thrown by HANA is:
* com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: [257]:
* sql syntax error: incorrect syntax near "of": line 1
*
*/
SomeEntity entity = session
.createQuery( "SELECT e FROM SomeEntity e WHERE e.id = :id", SomeEntity.class )
.setParameter( "id", id )
.setLockMode( lockModeType )
.uniqueResult();
assertNotNull( entity );
} );
}
@Entity(name = "SomeEntity")
public static class SomeEntity {
@Id
@GeneratedValue
private Integer id;
@Version
private Integer version;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
}
}