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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta