Las pruebas unitarias del código basado en Hibernate sobre hsqldb 1.8.1.3 ya no funcionan en hsqldb 2.2.9
Con frecuencia escribo pruebas unitarias de mi código dependiente de la base de datos utilizando una base de datos HSQL en memoria como la base de datos de prueba. Recientemente decidí actualizar de 1.8.1.3 a 2.2.9 para aprovechar el soporte de ROW_NUMBER () que se agregó en la versión de la versión 2.x.
Parece que de alguna manera, la nueva versión es más estricta que la versión anterior. Usando Hibernate (3.6.10) como ORM, podría, por ejemplo, crear unConfiguration
objeto para crear una primeraSessionFactory
, use eso para llenar los datos de prueba, luego use elConfiguration
a la clase en prueba, que crea su propiaSessionFactory
para hacer una selección. Con hsqldb 1.8.1.3, no hay problema. Con 2.2.9, los bloques seleccionados dentro del código hsqldb. A continuación se muestra un SSCCE que demuestra esto:
public void testTwoSessionFactories() throws Exception {
boolean withTx = false;
AnnotationConfiguration config = new AnnotationConfiguration().addAnnotatedClass(Entity.class);
config.setProperty("hibernate.hbm2ddl.auto", "create");
config.setProperty(Environment.DIALECT, HSQLDialect.class.getName());
config.setProperty(Environment.DRIVER, jdbcDriver.class.getName());
config.setProperty(Environment.URL, "jdbc:hsqldb:mem:testDB");
config.setProperty(Environment.USER, "SA");
config.setProperty(Environment.PASS, "");
SessionFactory sessionFactory1 = config.buildSessionFactory();
Session session = sessionFactory1.openSession();
Transaction tx = null;
if (withTx)
tx = session.beginTransaction();
session.save(new Entity("one"));
if (withTx)
tx.commit();
session.flush();
session.close();
config.setProperty("hibernate.hbm2ddl.auto", "");
SessionFactory sessionFactory2 = config.buildSessionFactory();
Session session2 = sessionFactory2.openSession();
List entities = session2.createCriteria(Entity.class).list();
session2.close();
}
Nota lawithTx
booleano Con HSQLDB 1.8.1.3, puedo ejecutar este código conwithTx
Verdadero o falso, y estará bien. Con HSQLDB 2.2.9,withTx
debe establecerse en verdaderoDe lo contrario, el hilo se bloquea en el.list()
llamar con la siguiente pila:
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: not available
CountDownLatch$Sync(AbstractQueuedSynchronizer).parkAndCheckInterrupt() line: not available
CountDownLatch$Sync(AbstractQueuedSynchronizer).doAcquireSharedInterruptibly(int) line: not available
CountDownLatch$Sync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int) line: not available
CountDownLatch.await() line: not available
CountUpDownLatch.await() line: not available
Session.executeCompiledStatement(Statement, Object[]) line: not available
Session.execute(Result) line: not available
JDBCPreparedStatement.fetchResult() line: not available
JDBCPreparedStatement.executeQuery() line: not available
BatchingBatcher(AbstractBatcher).getResultSet(PreparedStatement) line: 208
CriteriaLoader(Loader).getResultSet(PreparedStatement, boolean, boolean, RowSelection, SessionImplementor) line: 1953
CriteriaLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean) line: 802
CriteriaLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean) line: 274
CriteriaLoader(Loader).doList(SessionImplementor, QueryParameters) line: 2542
CriteriaLoader(Loader).listIgnoreQueryCache(SessionImplementor, QueryParameters) line: 2276
CriteriaLoader(Loader).list(SessionImplementor, QueryParameters, Set, Type[]) line: 2271
CriteriaLoader.list(SessionImplementor) line: 119
SessionImpl.list(CriteriaImpl) line: 1716
CriteriaImpl.list() line: 347
EntityTest.testTwoSessionFactories() line: 46
¿Qué cambió en HSQLDB entre 1.8.1.3 y 2.2.9 que requiere este código para guardar dentro de una transacción, y puedo desactivarlo?