2012-08-14 45 views
0

我想能夠支持以下Sybase ASE 15的語法在使用HSQL我單位/集成測試...Spring的嵌入式HSQL數據庫能否支持Sybase方言?

create table #myTable (value varchar(12) NULL) 

HSQL將無法識別該臨時表是如何命名,並且在baulks被#角色。相反HSQL想用這樣的事情...

create temporary table myTable (value varchar(12) NULL) 

,或者HSQL還支持最ANSI-92 SQL的根據自己的文檔,但是Sybase ASE的15不具有ANSI-92 SQL大力支持包括表如何臨時創建所以下面將不會在Sybase工作,但確實在HSQL ...

DECLARE LOCAL TEMPORARY TABLE mytable (value varchar(12) NULL) 

從一切我都試過,我不能拿出一個共同的語法,將與Sybase和HSQL工作。有誰知道一個乾淨的方法呢?

我想我唯一的選擇是創建獨立的DAO的每個數據庫的方言,並控制其中之一是在Spring應用程序上下文XML文件中使用。

我不使用Hibernate我的數據源,只有春天的JdbcTemplate。

回答

1

我選擇了通過實施一對夫婦方言輔助類的我DAO來解決這個問題。我的目標是

  1. 執行在生產中使用針對HSQL DATABSE代替的Sybase
  2. 試驗測試,我的大部分生產DAO儘可能包括 的RowMapper和對數據庫架構的各種SELECT/INSERT語句(但在HSQL實現)

吾道最終看上去像這樣(注意DialectHelper被注入)...

@Repository 
public class MyDaoJdbc MyDao { 

    private DialectHelper dialectHelper; 

    /* the meat of the DAO removed for clarity */ 

    @Override 
    public void createTemporaryTable() {   
     getSimpleJdbcTemplate().update(dialectHelper.getTempTableCreateSql()); 
    } 

    @Autowired 
    public final void setDialectHelper(DialectHelper dialectHelper) { 
     this.dialectHelper = dialectHelper; 
    } 
} 

...我的生產Spring的配置(彈簧db.xml)看起來像這樣並注入了SYBASE方言

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.sybase.jdbc2.jdbc.SybDriver" /> 
    <property name="url"     value="${jdbc.url}" /> 
    <property name="username"   value="${jdbc.username}" /> 
    <property name="password"   value="${jdbc.password}" /> 
</bean> 

<bean id="dialectHelper" class="com.acme.myapp.jdbc.DialectHelperSybase" /> 

...和我的測試Spring配置(彈簧DB-的test.xml)看起來是這樣的並注入了HSQL方言

<jdbc:embedded-database id="dataSource" type="HSQL"> 
    <jdbc:script location="classpath:/resources/schema.sql"/> 
    <jdbc:script location="classpath:/resources/test-data.sql"/> 
</jdbc:embedded-database> 

<bean id="dialectHelper" class="com.acme.myapp.dao.jdbc.DialectHelperHsql" /> 

的DialectHelper類提供從DAO分離出不兼容的數據庫語法的方式...

public class DialectHelperHsql implements DialectHelper { 
    @Override 
    public String getTempTableCreateSql() { 
     return "create temporary table myTable (value varchar(12) NULL)"; 
    } 
} 

public class DialectHelperSybase implements DialectHelper { 
    @Override 
    public String getTempTableCreateSql() { 
     return "create table #myTable (value varchar(12) NULL)"; 
    } 
} 

測試CLA SS本身初始化春與HSQL dialectHelper通過加載文件彈簧DB-的test.xml

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={ 
    "classpath:resources/spring-context.xml", 
    "classpath:resources/spring-db-test.xml"}) 
@Transactional 
@TransactionConfiguration(defaultRollback = true) 
public class MyDaoIntegrationHsqlTest { 
    ... 
}