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 属性を持つテーブルを誰でも生成できますか?