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

How can I debug processing of hibernate.hbm2ddl.import_files value combined with hsqldb?

在我正在处理的 Java 项目中,我为我们的单元测试设置了以下设置:

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

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

是否有任何方式或放置这些错误报告的,我显然没有意识到?是否有额外的 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>

不是您问题的真正答案,而是处理测试数据库人口的替代方法。

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>

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

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

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

我无法获取异常记录,就像@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());
}

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