2012-02-25 87 views
7

我正在使用HSQL在我的Java應用程序上運行多個單元測試。我正在使用Spring + Hibernate。從MySQL切換到HSQL時遇到問題。這些測試對MySQL的完美運行,但每當我改變HSQL我得到以下異常:HSQL org.hsqldb.HsqlException:無效的模式名稱

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

任何有識之士將不勝感激。

問候 克里斯

+0

也許一個案例的問題? 'LMS' vs'lms' – 2012-02-25 18:07:01

回答

5

我用以下豆在測試過程中創建架構。

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

等等...

2

名稱爲模式,表,列,等不(至少不是默認情況下)的情況下在MySQL敏感。 HSQLDB區分大小寫,但它也將查詢中未引用的所有標識符轉換爲大寫。

通過將模式名稱更改爲LMS到處(首先在數據庫中),您可以快速測試這是您的問題。你可以從這裏找到關於HSQLDB和Hibernate的更詳細的故事:HSQLDB No such table Exception

+0

然而,感謝您的評論,這是不成功的。我改變了對'LMS'的所有引用。我開始相信錯誤信息可能是誤導性的。下一步,當我得到一段時間後,會下載HSQL源代碼並進行調試。 – Kros 2012-02-27 00:34:16

3

爲了記錄,我設法通過從我的Hibernate實體中刪除'catalog'屬性來解決這個問題。因此,

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

成爲

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

謝謝。我有完全相同的問題,這解決了它。我的目錄參數是小寫,但它以大寫形式告訴我無效的模式名稱,因此可能存在案例衝突。 – Psyrus 2014-03-18 15:43:56

8

使 「創建-schema.sql文件」 文件

CREATE SCHEMA lms; 

添加 「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> 

集「取決於上「屬性爲」sessionFactory「bean

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