2017-03-21 10 views
4

私は、Springブート(1.4.4)アプリケーションでOracle(11.2)とPostgreSQL(9.4)でエンティティの作業をしようとしています。OracleとPostgreSQLで長いテ​​キスト列を持つHibernate

私のエンティティには、長いテキストフィールド(4000文字以上)が含まれています。 Oracleの適切なデータ型はCLOBで、PostgreSQLの対応する型はTEXTです。

私はCLOBが@Lob注釈を必要とするので、それは休止状態の検証段階でOracleに失敗するでしょうが、それはPostgreSQLの

@Column(name = "LONG_TEXT", columnDefinition="TEXT") 
private String longText; 

で動作させることができますよ。

次のコードのOracle

@Lob 
@Column(name = "LONG_TEXT") 
private String longText; 

と、次の例外を除いてはPostgreSQLからの読み取り時には失敗したが、この時に動作します:

PSQLException:ラージ・オブジェクトが自動コミットモードで使用することはできませんが

Stack overflow suggestsトランザクションでクエリを実行します。 selectクエリでトランザクションを呼び出すための疑わしい要件を無視して、@Transactionalをクエリメソッドに追加することは役に立ちませんでした。

いずれの考えも歓迎されています。

+0

同じ '@ Table'アノテーションを持つが、' @ Lob'で異なる同一のエンティティを作成する以外の解決策はないと思いますが、明らかにすると、エンティティタイプを共有する2つの永続ユニットがあります別のサーバーで異なるデータベースを使用する1つのアプリですか? – coladict

+0

['@Lob @Type(type =" org.hibernate.type.StringClobType ")'](https://hibernate.atlassian.net/browse/HHH-6105)を試しましたか?また、SOのどこかにカスタムの休止状態の方言の回避策もありました。 – pozs

+0

@coladict - これは、2つの異なるデータベースをサポートする必要がある1つのアプリです。 異なるエンティティの作成に関しては、コードベース全体に変更をもたらさない方法がありますか? – Boris

答えて

0

私たちが得た解決策は、@Lobと@Transactionalアプローチを採用することです。

主な問題は@Transactionalアノテーションの配置にあり、PSQLExceptionが発生しました。一旦修正されると、我々は両方のタイプのDBで作業することができました。

関連する問題