1

HSQLを使用するユニット/統合テストで次のSybase15ASE構文をサポートできるようにしたいと思います...

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

HSQLは、一時テーブルの名前を認識せず、#文字を攻撃します。代わりに、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 ApplicationContextXMLファイルで使用されるDAOを制御することです。

データソースにHibernateを使用せず、SpringのJdbcTemplateのみを使用します。

4

1 に答える 1

1

私は、DAO に方言ヘルパー クラスをいくつか実装することで、この問題を解決することにしました。私の目標は

  1. Sybase の代わりに HSQL データベースに対してテストを実行する
  2. RowMapper やさまざまな SELECT/INSERT ステートメントを含め、実稼働環境で使用されている (ただし HSQL で実装されている) データベース スキーマに対して、できるだけ多くの実稼働環境の DAO をテストします。

私のDAOはこのようになりました(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構成(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 構成 (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)";
    }
}

Test クラス自体は、ファイル spring-db-test.xml をロードすることにより、HSQL dialectHelper で Spring を初期化します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
    "classpath:resources/spring-context.xml",
    "classpath:resources/spring-db-test.xml"})
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class MyDaoIntegrationHsqlTest {
    ...
}
于 2012-08-22T08:16:31.423 に答える