2012-02-25 10 views
7

Sto utilizzando HSQL per eseguire un numero di test di unità sulla mia applicazione java. Sto usando Spring + Hibernate. Sto avendo un problema quando si passa da MySQL a HSQL. I test eseguiti perfettamente su MySQL, ma ogni volta che cambia a HSQL ottengo la seguente eccezione:HSQL org.hsqldb.HsqlException: nome schema non valido

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) 

La mia configurazione La primavera è la seguente:

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

annotazione di esempio a uno dei miei corsi:

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

Qualsiasi intuizione sarebbe apprezzata.

saluti Chris

+0

Forse un problema? 'LMS' vs' lms' –

risposta

5

Io uso a seguito di fagioli per creare lo schema durante i test. configurazione

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"); 
    } 

} 

molla:

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

ecc ...

2

nomi per gli schemi, tabelle, colonne, ecc non (almeno non di default) caso sensibile MySQL sono . HSQLDB fa distinzione tra maiuscole e minuscole, ma converte anche tutti gli identificatori nella query che non sono citati in maiuscolo.

È possibile testare rapidamente questo problema modificando il nome dello schema su LMS ovunque (prima nel database). Puoi trovare una storia più dettagliata su HSQLDB e Hibernate da qui: HSQLDB No such table Exception

+0

Grazie per il tuo commento, tuttavia, questo non ha avuto successo. Ho cambiato tutti i riferimenti a "LMS". Sto iniziando a credere che il messaggio di errore potrebbe essere fuorviante. Il passo successivo, quando avrò un po 'di tempo, sarà il download del codice sorgente HSQL e del debug. – Kros

3

Solo per la cronaca sono riuscito a risolvere questo semplicemente rimuovendo l'attributo 'catalogo' dalle mie entità di Hibernate. Quindi,

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

divenne

@Entity 
@Table(name = "answer") 
+0

Grazie. Ho avuto lo stesso problema e questo lo ha risolto. I miei parametri di catalogo erano in minuscolo, ma mi dice il nome dello schema non valido in maiuscolo, quindi forse c'è stato un conflitto di casi. – Psyrus

8

make "creare-schema.sql" file di

CREATE SCHEMA lms; 

add fagiolo "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> 

set "dipende-on "attributo al bean" sessionFactory "

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