HHH-11656 - Added test case.
This commit is contained in:
parent
85016e0bca
commit
05f8e7306e
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue