2010-11-18 9 views
9

実稼働環境ではHibernateとPostgreSQLを、テストではHSQLDBを使用する際に問題があります。
私は、Hibernateがデータベーススキーマを作成できるように、トップダウンアプローチを使用しています。
私も注釈を使用しています。 hibernate.cfg.xmlのマッピングの一部にのみいくつかのケースでは私のために十分ではありませんPostgreSQLの上(255)を変化させる文字に
<mapping class="package.subpackage.ClassName" />
Hibernateはデフォルトの文字列変数のような行が含まれているので、私は手動で
を使用して、いくつかの列を再定義する必要があります@Column(columnDefinition = "TEXT")
ただし、TEXTタイプはHSQLDBでは無効です。したがって、これらのテーブルは作成できません。

これを解決するお手伝いができますか?Hibernate postgresql/hsqldb TEXTカラムの非互換性の問題

+0

また、テストにPostgresを使用しようとしましたか?はいの場合、あなたはどのような問題を抱えていますか? –

+0

はい、私はPostgresを使ってテストしています。問題はありません。hsqldbの非互換性の問題のみ – Nemanja

答えて

10

この特定の問題に対処する最も簡単な方法は全くcolumnDefinitionを使用しないように、代わりに明示的に(例えば)で列の長さを指定するには、おそらく

@Column(length=10000) 

また、あなたが代わりにできたのかもしれません @Lob(type = LobType.CLOB)

でマップしますが、HSQLDBで正しくサポートされているかどうかはわかりません。 Postgresでは、あなたのTEXT型を与えるはずです。

+0

ええ、やっぱり、長さはトリックです! – Nemanja

+1

はい、これは最も単純な解決策ですが、私はpostgres互換モードでHSQLDBを使用することをお勧めします。 –

-5

はい、あなたはが本当に大きいです問題です。

テスト用に1つのデータベースエンジンを使用しないでください。

あなたが夢にも思わなかった問題を打つことができます。

+0

ええ、ありがとう、私はそれを念頭に置いて、テストを整理して両方のデータベースで簡単に実行できるようにしました。しかし、最近私はこの小さな変化を経験し、hsqldbは問題を作り始めました。 – Nemanja

+19

はい、いいえ**テスト環境**は本番環境とまったく同じです**。しかし、単体テストはまったく違っています。つまり、Apache DerbyやHSQLDBのようなメモリ内データベースの使用は完全にうまくいきます。そしてそれは何ですか?多くの利点があります。 –

+0

このコメントは、多くの環境で成果物を展開する必要のあるプロジェクトの種類を考慮して、テストや本番用に複数のデータベースエンジンを使用する場合に最も適しています。 –

6

HSQLDB 2.1以降では、PostgreSQL互換モードがあり、このモードでTEXTデータ型をサポートしています。

8

@fredtと同意します。 TEXTデータ型は標準のSQL型ではありませんが、一部のエンジンでサポートされている拡張機能です。

有効にするにはPostgreSQL互換モードを接続パラメータにsql.syntax_pgs=trueを使用してください。

2

H2をPostgreSQLとの互換性モードで動作させるには(junitテストに便利です)。

# JDBC Driver 
jdbc.driverClassName=org.h2.Driver 
jdbc.url=jdbc:h2:mem:play;MODE=PostgreSQL;TRACE_LEVEL_SYSTEM_OUT=2;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;INIT=CREATE TABLE IF NOT EXISTS PG_CLASS (RELNAME text, RELKIND text); 
jdbc.username=sa 
jdbc.password= 

# general hibernate options 
hibernate.database=h2 
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect 

Hibernate/JPAが正しく機能するためには、create table PG_CLASSが必要です。しかし、それ以外のものはかなりシームレスです。