2012-02-25 36 views
7

Estoy utilizando HSQL para ejecutar una serie de pruebas de unidad en mi aplicación Java. Estoy usando Spring + Hibernate. Tengo un problema al cambiar de MySQL a HSQL. Las pruebas se ejecutan perfectamente en MySQL, pero cada vez que cambio a HSQL me sale el siguiente excepción:HSQL org.hsqldb.HsqlException: nombre de esquema no válido

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) 

Mi configuración de Spring es el siguiente:

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

anotación de la muestra en una de mis clases:

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

Cualquier observación sería apreciada.

Saludos Chris

+0

¿Tal vez un problema de caso? 'LMS' vs' lms' –

Respuesta

5

utilizo frijol siguiente para crear el esquema durante las pruebas. configuración

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

} 

primavera:

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

y así sucesivamente ...

2

Nombres de esquemas, tablas, columnas, etc., no (al menos no por defecto) entre mayúsculas y minúsculas en MySQL son . HSQLDB distingue entre mayúsculas y minúsculas, pero también convierte todos los identificadores en consultas que no están citados en mayúsculas.

Puede probar rápidamente si este es su problema cambiando el nombre del esquema a LMS en todas partes (primero en la base de datos). Usted puede encontrar la historia más detallada sobre HSQLDB e Hibernate desde aquí: HSQLDB No such table Exception

+0

Gracias por su comentario, sin embargo, esto no fue exitoso. He cambiado todas las referencias a 'LMS'. Estoy empezando a creer que el mensaje de error podría ser engañoso. El siguiente paso, cuando tenga algo de tiempo, será descargar el código fuente HSQL y depurarlo. – Kros

3

Sólo para que conste logré resolver éste simplemente quitando el atributo 'catálogo' de mis entidades de Hibernate. Por lo tanto,

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

convirtió

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

Gracias. Tuve exactamente el mismo problema y esto lo resolvió. Los parámetros de mi catálogo estaban en minúscula, pero me dice el nombre del esquema no válido en mayúsculas, por lo tanto, tal vez haya un conflicto de caso. – Psyrus

8

hacer archivo "crear-schema.sql"

CREATE SCHEMA lms; 

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

conjunto "depende-de "atributo a" sessionFactory "bean

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