如何调试 hibernate.hbm2ddl.import_files 值与 hsqldb 结合的处理?
How can I debug processing of hibernate.hbm2ddl.import_files value combined with hsqldb?
在我正在处理的 Java 项目中,我为我们的单元测试设置了以下设置:
- 我正在使用 Spring 测试 MVC,
@RunWith(SpringJUnit4ClassRunner.class)
和 @WebAppConfiguration
到 运行 单元测试,我使用 MockMvc
创建实例 webAppContextSetup(webApplicationContext)
测试应用程序。
- 我有一个 Hibernate 配置来设置内存中的 HSQLDB,所有表都是基于 @Entity 类.
创建的
- 在 Hibernate 配置中,我正在设置
hibernate.hbm2ddl.import_files
属性 以使用 SQL 语句加载文件 import.sql
以填充(内存中)数据库.
现在,我已经确认了以上所有这些工作:
- 测试可以从内存数据库成功insert/retrieve。
import.sql
中的 SQL 语句已执行,正如各种测试所证实的那样。
现在 问题 :我在 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());
}
考虑到初始化脚本是静态的而不是真正的业务数据,这可能就足够了,一旦你让它们工作,它们希望 继续工作。
在我正在处理的 Java 项目中,我为我们的单元测试设置了以下设置:
- 我正在使用 Spring 测试 MVC,
@RunWith(SpringJUnit4ClassRunner.class)
和@WebAppConfiguration
到 运行 单元测试,我使用MockMvc
创建实例webAppContextSetup(webApplicationContext)
测试应用程序。 - 我有一个 Hibernate 配置来设置内存中的 HSQLDB,所有表都是基于 @Entity 类. 创建的
- 在 Hibernate 配置中,我正在设置
hibernate.hbm2ddl.import_files
属性 以使用 SQL 语句加载文件import.sql
以填充(内存中)数据库.
现在,我已经确认了以上所有这些工作:
- 测试可以从内存数据库成功insert/retrieve。
import.sql
中的 SQL 语句已执行,正如各种测试所证实的那样。
现在 问题 :我在 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());
}
考虑到初始化脚本是静态的而不是真正的业务数据,这可能就足够了,一旦你让它们工作,它们希望 继续工作。