0

Spring (2.5.6)、Hibernate (3.2.6)、および Oracle 11g DBMS を既に使用しているレガシー コードベースに JUnit テストの機能を追加しようとしています。Hibernate で HSQLDB インメモリ データベース内のすべてのテーブルを生成するようにします。残念ながら、既存の Hibernate マッピングは、Oracle DB の代わりに HSQLDB を使用できないようにする、Oracle DB のユーザー定義データ型を使用します。

ここに私のapplication-context-test.xml があります:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:mydb" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>

            <prop key="hibernate.cache.use_second_level_cache">false</prop>

            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>

    <property name='mappingResources'>
        <list>
            <value>first.hbm.xml</value>
            <value>second.hbm.xml</value>
        </list>
    </property>
</bean>

これは、私のビジネス オブジェクトのほとんどでうまく機能します。残念ながら、テーブル ジェネレーターは、一部のビジネス オブジェクトで使用されているユーザー定義型を処理できないようです。このhbm.xmlファイルは、varchar2 の「sql-type」属性を削除するまで機能しません。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="first"
    table="FIRST">

<!-- ... -->
<property name="someBoolean" type="yes_no">
    <column name="SOME_BOOLEAN" length="1" sql-type="varchar2"></column>
<!-- ... -->
</class>
</hibernate-mapping>

また、これらのユーザー タイプのデフォルト値は機能しません。

     <property name="someOtherBoolean" type="yes_no">
        <column name="SOME_OTHER_BOOLEAN" length="1" not-null="true" default="no"/>
     </property>

これらのユーザー タイプを削除すると、アプリケーションは引き続き機能しますが、Schema-Validation (検証) はエラーで失敗します。

Wrong column type ... Found: varchar2, expected: char1(1 char)

ユーザー定義型を維持しながらテーブルを生成するにはどうすればよいですか? ありがとう!

編集:「sql.syntax_ora = true」をapplication-context-test.xmlに追加して、Oracle-syntaxのサポートを有効にしようとしました:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:mydb;sql.syntax_ora=true" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

しかし、何も変わりませんでした。このオプションは、ユーザー定義型をサポートしていないか、正しく適用できませんでした。

編集 2:古い 1.8.1.3 の代わりに、HSQLDB (2.3.0) の最新のスナップショットを使用しました。これにより、マッピング エラーが変更されましたが、解決されませんでした。たとえば、今私は持っています

unexpected token: NO

次のマッピングで:

     <property name="someOtherBoolean" type="yes_no">
        <column name="SOME_OTHER_BOOLEAN" length="1" not-null="true" default="no"/>
     </property>

結論として、HSQLDB の最新リリースには適切な Oracle サポートもありません。

編集 3:使用されている 3.2.6 が古すぎる可能性があるため、Hibernate 4.1.1 に更新したかっただけです。残念ながら、現在解決できない非互換性があります。アップグレードが私の問題を解決するなら興味深いでしょう - Hibernate の 4.x バージョンを使用して、指定された Oracle 属性を持つテーブルを誰でも生成できますか?

4

1 に答える 1

0

検証メッセージを回避するためcolumnDefinition = "varchar2(1)"に、私にとって役に立ちました:

@Column(name="BOOLEAN_COLUMN", columnDefinition = "varchar2(1)")
@Type(type = "yes_no")
private Boolean booCol;
于 2013-10-14T12:34:46.357 に答える