【问题标题】:HSQL org.hsqldb.HsqlException: invalid schema nameHSQL org.hsqldb.HsqlException:无效的模式名称
【发布时间】:2012-03-15 19:33:17
【问题描述】:

我正在使用 HSQL 在我的 java 应用程序上运行一些单元测试。我正在使用 Spring + Hibernate。从 MySQL 切换到 HSQL 时遇到问题。测试在 MySQL 上运行完美,但每当我更改为 HSQL 时,都会出现以下异常:

Caused by: org.hsqldb.HsqlException: invalid schema name: LMS
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.SchemaManager.getSchemaHsqlName(Unknown Source)
at org.hsqldb.SchemaManager.getSchemaName(Unknown Source)
at org.hsqldb.Session.getSchemaName(Unknown Source)
at org.hsqldb.SchemaManager.getTable(Unknown Source)
at org.hsqldb.ParserDQL.readTableName(Unknown Source)
at org.hsqldb.ParserDQL.readSimpleRangeVariable(Unknown Source)
at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)

我的 Spring 配置如下:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver" />
    <property name="url" value="jdbc:hsqldb:file:lms" />
    <property name="username" value="SA"/>
    <property name="password" value=""/>
</bean>


<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />

    <property name="packagesToScan">
        <list>
            <value>com.dreamteam.lms.**.*</value>
        </list>
    </property>

    <property name="hibernateProperties">
        <props>
            <!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>-->
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>
        </props>
    </property>
</bean>

我的一个类的示例注释:

@Entity
@Table(name = "answer", catalog = "lms")
public class Answer implements Cloneable, Serializable, IPojoGenEntity, IAnswer {
.
.

任何见解将不胜感激。

问候 克里斯

【问题讨论】:

  • 可能是案例问题? LMSlms

标签: java spring hibernate hsqldb


【解决方案1】:

制作“create-schema.sql”文件

CREATE SCHEMA lms;

添加“dataSourceInitializer”bean

<bean id="dataSourceInitializer" class="org.springframework.jdbc.datasource.init.DataSourceInitializer">
    <property name="dataSource" ref="dataSource" />
    <property name="databasePopulator">
        <bean class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator">
            <property name="continueOnError" value="true" />
            <property name="scripts">
                <list>
                    <value>classpath:SQL/create-schema.sql</value>
                </list>
            </property>
        </bean>
    </property>
</bean> 

将“depends-on”属性设置为“sessionFactory”bean

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" depends-on="dataSourceInitializer">
...

【讨论】:

    【解决方案2】:

    我在测试期间使用以下 bean 创建架构。

    public class HSQLSchemaCreator {
    
        private String schemaName;
    
        private DataSource dataSource;
    
        public HSQLSchemaCreator(String schemaName, DataSource dataSource) {
            this.schemaName = schemaName;
            this.dataSource = dataSource;
        }
    
    
        @PostConstruct
        public void postConstruct() throws Exception {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            jdbcTemplate.execute("CREATE SCHEMA " + schemaName + " AUTHORIZATION DBA");
        }
    
    }
    

    弹簧配置:

      <bean id="hsqlSchemaCreator" class="....HSQLSchemaCreator">
           <constructor-arg name="schemaName" value="..."/>
           <constructor-arg name="dataSource" ref="dataSource"/>
      </bean>
    
    <!-- Override entityManagerFactory to depend on hsqlSchemaCreator for tests  -->
    <bean id="entityManagerFactory"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="hsqlSchemaCreator">
    

    等等……

    【讨论】:

    • 嗨,有没有办法将 xml 配置移动到 java-config(注释)中?也许对于 Spring Data?谢谢!
    【解决方案3】:

    为了记录,我设法通过简单地从我的 Hibernate 实体中删除“目录”属性来解决这个问题。因此,

    @Entity
    @Table(name = "answer", catalog = "lms")
    

    成为

    @Entity
    @Table(name = "answer")
    

    【讨论】:

    • 谢谢。我有完全相同的问题,这解决了它。我的目录参数是小写的,但它告诉我大写的模式名称无效,因此可能存在大小写冲突。
    【解决方案4】:

    模式、表、列等的名称在 MySQL 中(至少默认情况下不)不区分大小写。 HSQLDB 区分大小写,但它也会将查询中未引用的所有标识符转换为大写。

    您可以通过将架构名称随处更改为 LMS(首先在数据库中)来快速测试您的问题。你可以从这里找到更多关于 HSQLDB 和 Hibernate 的详细故事:HSQLDB No such table Exception

    【讨论】:

    • 感谢您的评论,但是这并不成功。我已更改所有对“LMS”的引用。我开始相信该错误消息可能具有误导性。下一步,当我得到一些时间将下载HSQL源代码并调试。
    【解决方案5】:

    我不知道为什么会这样,但至少对我来说,在表名和架构周围添加方括号对我有用:

    @Table(name = "schema.tableName")
    

    成为

    @Table(name = "[schema].[tableName]")
    

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多