如何调试与hsqldb结合的hibernate.hbm2ddl.import_files值的处理?

时间:2015-04-20 20:22:52

标签: java spring hibernate hsqldb spring-test-mvc

在我正在研究的Java项目中,我为单元测试提供了以下设置:

  • 我正在使用Spring Test MVC,@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration来运行单元测试,并使用MockMvc创建一个webAppContextSetup(webApplicationContext)实例来测试应用程序。< / LI>
  • 我有一个Hibernate配置来设置内存中的HSQLDB,所有表都是基于@Entity类创建的。
  • 在Hibernate配置中,我设置hibernate.hbm2ddl.import_files属性以使用SQL语句加载文件import.sql以填充(内存中)数据库。

现在,我已经确认了以上所有这些工作:

  • 测试可以从内存数据库中成功插入/检索。
  • 执行import.sql中的SQL语句,各种测试都会确认。

现在问题:我在import.sql中添加的语句出现的错误似乎没有在任何地方报告,也没有任何迹象表明发生了错误。相反,后续语句根本不会执行。 (我通过测试证实了这一点。)

是否有任何方式或地点 报告我显然不知道?是否有额外的Hibernate属性?

摘自hibernate测试配置:

    <bean id="sessionFactory" name="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.archive.autodetection">class,hbm</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop>
                <prop key="hibernate.connection.username">sa</prop>
                <prop key="hibernate.connection.password"></prop>
                <prop key="hibernate.connection.url">jdbc:hsqldb:mem:myschema</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                <prop key="hibernate.hbm2ddl.import_files">configuration/test/import.sql</prop>
                <prop key="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</prop>
                <!-- when using type="yes_no" for booleans, the line below allow booleans in HQL expressions: -->
                <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
            </props>
        </property>
    </bean>

3 个答案:

答案 0 :(得分:1)

不是您的问题的答案,而是处理测试数据库填充的替代方法。

Spring中有一个名为jdbc的XML命名空间,它允许您在Spring上下文启动期间使用初始数据预填充数据库。它还可以很好地报告SQL中的错误:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jdbc="http://www.springframework.org/schema/jdbc"
   xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/jdbc
       http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">

    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="org/mytestproject/schema-drop-hsqldb.sql" />
        <jdbc:script location="org/mytestproject/schema-hsqldb.sql" />
        <jdbc:script location="org/mytestproject/data-hsqldb.sql" />
    </jdbc:initialize-database>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="validationQuery" value="${jdbc.validationQuery}"/>
    </bean>
</beans>

答案 1 :(得分:1)

我无法像@Julien Kroneg建议的那样获取异常记录。

但是我能够在方法org.hibernate.tool.hbm2ddl.SchemaExport#importScript的catch块中放置一个断点,其中trimmedSql代表正在应用的每个SQL语句:

catch ( Exception e ) {
    if (haltOnError) {
        throw new ImportScriptException( "Error during statement execution (file: '"
                + namedReader.getName() + "'): " + trimmedSql, e );
    }
    exceptions.add(e);
    LOG.unsuccessful(trimmedSql);
    LOG.error(e.getMessage());
}

考虑到初始化脚本是静态的而不是真正的业务数据,这可能就足够了,一旦使它们开始工作,便希望它们继续工作。

答案 2 :(得分:0)

您可以使用级别TRACE激活类org.hibernate.tool.hbm2ddl.SchemaExport上的日志记录。

在DEBUG级别记录了一些错误(例如找不到文件):

10:29:21,039 DEBUG SchemaExport:353 - Import file not found: ../myFile.sql