私はOracle 10gとHibernate 2.1(古いバージョンですが、修正するためにアップグレードすることはできません)を使用しています。私はTIN、varchar2(9)という名前のnullableではない列を持つテーブルを持っています。この列は、フラットファイルからロードされたデータをステージングするために使用されるため、9つのスペース(入力ファイルに9つのスペースがある場合は '')を含む長さ9の任意の文字列を格納できます。Hibernateが文字列をトリミングしないようにするにはどうすればよいですか?
のOracle 10gは自動的にNULLに空の文字列を変換します
は私が気づいたことはということです。したがって、実行すると:
SELECT NVL('', 'Input string converted to NULL') FROM dual;
結果は「入力文字列はNULLに変換されました」ではなく「」です。私はこれが問題に関連していると思う。
TIN値が9文字(または任意の数のスペース)で、他の文字がないレコードをHibernateが読み込むと、その値がメモリに ''として格納されます。 Hibernateはその後、値が9つの空白から空の文字列に変更されたと考えるようになりました。レコードがデータベースに書き戻された場合、Hibernateは空白文字列を9文字ではなく空文字列に書き出しようとし、Oracleは明らかにこれをnullに変換してからnull以外の制約違反をスローします。参考のため
、ここHBMは、このコラムのためです:
<property
name="tin"
type="java.lang.String"
column="TIN"
not-null="true"
length="9">
私の質問は、どのように私は、文字列のみを空にスペースを含む値を変換しないで休止状態指示していますか?
更新1:私は戻って 'text'のような文字列をテストしただけで、Hibernateはこれらのスペースもトリミングし、文字列 'text'を作り、値が変更されたと考えてしまうことに気付きました。私は何かを欠いているに違いない。これはデフォルトの動作のようには見えません。
アップデート2:これは、JavaソースへのHBMは、文字列のトリムの源であるかもしれない変換hbm2java Antタスクのように見えます。まだ調査中。
おかげで、 ジェフ
編集:変更された質問の文言は、より正確に。
ありがとうございます。これはかなり良いアプローチのようです。私が見ている最大の問題は、Hibernateの外部でそのデータにアクセスするすべてのものは、値がエスケープされていることも認識していなければならないということです。私は、Hibernateトリミング値のこの動作が正常/文書化されているかどうか疑問に思っています。 – jlpp
True - ハイバネート以外のデータベースにアクセスするコードの他の部分がある場合、それが問題です。 –
残念ながら、これが当てはまります。フラットファイルをバッチ処理して同じ列を読み書きするストアドプロシージャがあります。しかし、ありがとう。あなたのことは確かな答えでした。 – jlpp