1
@Column(name="transpired")
@Lob
private String transpired;
public String getTranspired() {
    return transpired;
}
public void setTranspired(String transpired) {
    this.transpired = transpired;
}

モデルクラスで次のコードを使用してみました。Transpiredは、長いテキストメッセージ(レポート)を含むフィールドです。「レポート」を表示すると、データベースからデータが取得され、UIに正しく表示されます。ただし、レポートを(編集または作成時に)保存している場合、データベースのフィールド保存は(null)です。

長いテキストを保存する方法について何かアイデアはありますか?以前はvarchar2(4000)を使用していましたが、ほとんどのレポートは4000文字を超えています。

ありがとう。

編集: 私はOracle10gを使用しています。列タイプはCLOBです。

4

3 に答える 3

4

Oracleが提供するPOSシンドライバは、4Kを超えて保存しようとするとCLOBフィールドを自動的かつサイレントに無効にすることでよく知られています(4Kを超える節約、cLobにとっては驚くべきことです)。ただし、これは、Hibernateが行う標準APIをOracle 10g JDBCドライバーで使用する場合に機能するはずです( Oracle 10gでのClobsの処理を参照)。驚いたことに、多くのスレッド(このスレッドなど)は、古いバージョンのOracle 10gシンドライバーで同様の問題に言及しているため、必ずOracle 10gリリース2ドライバー(最新のojdbc14.jar、つまり10.2.0.4を選択)以降を使用してください。

OracleにはCLOBに対して32Kの制限があることに注意してください。この制限を克服するには、接続プロパティSetBigStringTryClobをに設定する必要がありますtruebatch_sizeさまざまな情報源によると、JDBCバッチ処理を無効にする(つまり、に設定する)必要があるようです0

これを行うには、次のプロパティをにhibernate.cfg.xml(またはSpring構成に)追加します。

<!-- Tell Oracle to allow CLOBs larger than 32K -->
<property name="hibernate.connection.SetBigStringTryClob">true</property>
<property name="hibernate.jdbc.batch_size">0</property>
于 2010-01-25T07:02:36.213 に答える
0

oracle9iを使用すると、同じ問題に直面し、それを解決できませんでした。JDBCを使用して手動で実行する必要がありましたが、JPAでは簡単です。彼らが冬眠でそれを解決したかどうかはわかりません、それは1年半前でした:(

于 2010-01-22T20:43:05.890 に答える
0

hibernateを介してデータを挿入する場合は、以下のコードをSpringsXMLに追加します。

<property name="hibernate.connection.SetBigStringTryClob">true</property>
 <property name="hibernate.jdbc.batch_size">0</property>

また

<prop key="hibernate.connection.SetBigStringTryClob">true</prop>
 <prop key="hibernate.jdbc.batch_size">0</prop>

JDBCを介して追加することに関心がある場合は、データソースに次のコードを追加します。たとえば、JBOSSの場合はOracle-ds.xmlです。

<connection-property name="SetBigStringTryClob">true</connection-property> 

最新のojdbc14.jarを使用し、JDBC接続に使用していることを確認してください。また、classes12.jarなどの一部のjarは、巨大なclobの保存を妨げます。したがって、classes12.jarをojdbc14.jarに置き換えてください。

これは私のために働いた。

于 2013-05-16T10:16:08.920 に答える