HSQL org.hsqldb.HsqlException: недопустимое имя схемы

Я использую 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 {
.
.

Любое понимание будет оценено.

С уважением Крис


person Kros    schedule 25.02.2012    source источник
comment
Может дело в чемодане? LMS против lms   -  person ndeverge    schedule 25.02.2012


Ответы (5)


создать файл "create-schema.sql"

CREATE SCHEMA lms;

добавить bean-компонент dataSourceInitializer

<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> 

установить атрибут "зависит от" для bean-компонента "sessionFactory"

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" depends-on="dataSourceInitializer">
...
person 박찬신    schedule 15.08.2013

Я использую следующий 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">

и так далее...

person František Hartman    schedule 25.02.2012
comment
Привет, есть ли способ переместить конфигурацию xml в java-config (аннотации)? Может быть, для Spring Data? Спасибо! - person user2722077; 13.03.2018

Просто для записи, мне удалось решить эту проблему, просто удалив атрибут «каталог» из моих сущностей Hibernate. Следовательно,

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

стал

@Entity
@Table(name = "answer")
person Kros    schedule 01.04.2012
comment
Спасибо. У меня была такая же проблема, и это решило ее. Параметры моего каталога были в нижнем регистре, но он сообщает мне недопустимое имя схемы в верхнем регистре, поэтому, возможно, произошел конфликт регистра. - person Psyrus; 18.03.2014

Имена схем, таблиц, столбцов и т. Д. Не чувствительны к регистру (по крайней мере, по умолчанию) в MySQL. HSQLDB чувствителен к регистру, но также преобразует все идентификаторы в запросе, которые не заключены в кавычки, в верхний регистр.

Вы можете быстро проверить, является ли это вашей проблемой, изменив имя схемы на LMS везде (сначала в базе данных). Вы можете найти более подробную историю о HSQLDB и Hibernate здесь: HSQLDB Нет такой таблицы Исключение

person Mikko Maunu    schedule 25.02.2012
comment
Спасибо за ваш комментарий, однако это не удалось. Я изменил все ссылки на «LMS». Я начинаю полагать, что сообщение об ошибке может вводить в заблуждение. Следующим шагом, когда у меня будет время, будет загрузка исходного кода HSQL и отладка. - person Kros; 27.02.2012

Я не уверен, почему это сработало, но для меня, по крайней мере, добавление квадратных скобок вокруг имен таблиц и схемы помогло мне:

@Table(name = "schema.tableName")

стал

@Table(name = "[schema].[tableName]")
person qasimir    schedule 14.08.2018