2017-09-27 9 views
0

私はテーブルに新しいCLOB列を追加し、私のhbm.xml修正この新しい列を使用してファイルを(古い列は、VARCHAR2、したがって、小さすぎました)Java_Hibernate 3_CLOB_ORA-01461

ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column 

私は、このエラーと検索結果:最初に、私はこの例外を得たので、デモンストレーションの目的の名前)

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="test.com.TestDO" table="TESTTABLE"> 
    <id name="id" type="java.lang.Integer"> 
     <column name="ID"/> 
     <generator class="sequence"> 
     <param name="sequence">SEQ_SEQUENCENAME</param> 
     </generator> 
    </id> 
    </property> 
     <property name="columnName1" type="java.util.Date"> 
      <column name="COLUMN_NAME1"/> 
     </property> 
     <property name="columnName2" type="java.lang.String"> 
      <column name="COLUMN_NAME2"/> 
     </property> 
     <property name="columnName3" type="java.lang.String"> 
      <column name="COLUMN_CLOB"/> 
     </property> 
     </class> 
    </hibernate-mapping> 

あなたが見ることができるように、私のCLOBカラム(COLUMN_CLOB)は、最後のように定義されます解決策はp insert文の中で最後にclobバインディングを作成するので、上で分かるように、hbm.xmlファイルのclob-columnを最後に定義しました。

今、私はORA-24816例外を得ていないのですが、私はこの例外を取得しています:

ORA-01461: can bind a LONG value only for insert into a LONG column 

生成された挿入文は次のようになります。あなたは気づいているかもしれませんが

insert into TESTTABLE(COLUMN_NAME1, COLUMN_NAME2, COLUMN_CLOB, ID) values (?, ?, ?, ?)]; 

COLUMN_CLOB - 列は、生成されたInsert-Statementの最後には現れません。 hbm-xml-fileの順序が、生成されたinsert文の列の順序に影響するかどうかはわかりません。

しかし、とにかく、私はORA-24816をもうORA-01461にしていません。私はこの問題の解決方法を知らない。

私は休止状態3とOracleのバージョン使用しています:Enterprise Editionのリリース11.2.0.4.0 - 64ビットの生産を

編集:ここで説明したように、私は正確に同じ問題を持っている

http://newtechnobuzzz.blogspot.ch/2014/07/ora-24816-expanded-non-long-bind-data.html#.Wcy-QdFpHRY

私は次のソリューションを試しました:

  • getterとsetterメソッドの順序が変わらない

リンク上の他のサイト上で説明した問題が動作しないのhbm.xmlの-fileで宣言されたプロパティの順序を変更し、あなたがデータを挿入しようとした場合、このexcpetion が発生している状態varchar2とclob列(長さが4000の2つの文字列)の両方にあります。しかし私は4000より大きいclob列にデータを挿入するだけです。古いvarchar2列はもう使用しません。

今、私はこの解決策を使用してこれを解決しようとしています。 2つの更新クエリを書くことで解決できます。最初に、Updateクエリでエンティティを保存/更新し、そのエンティティのLOB列を更新する別のクエリを作成します。

しかし、私は自分のコードをどのように修正するべきか、かなり理解していません。私の方法は次のようになります。私が見ることができるものから

@Override 
@Transactional(readOnly=false, propagation=Propagation.MANDATORY) 
public TestDO saveTest(TestDO test) { 

    getHibernateTemplate().saveOrUpdate(test); 

    return test; 
} 

答えて

0

、プロパティの型はCLOB列に正しく宣言されていない、それを試してみてください。

<property name="columnName3" length="100000" type="StringClob"> 
    <column name="COLUMN_CLOB"/> 
</property> 
+0

をしかし、私は、文字列を保存しています。文字列が4000よりも大きいので、それらをclob列に保存したいのです。したがって、java.lang Stringを型として使用する必要がありますか?私もclob列を持ち、hbm.xmlファイルでjava.lang.Stringとして宣言されている他のテーブルを持っています。 – Norbert94

+0

私の推測では、列の型と列に渡されたデータ型の間に不一致があります。 java.lang.Stringの代わりにjava.sql.Clobを使用する必要があります それが他のテーブルで動作する場合は、挿入ステートメントと列宣言の間の列順序付きのものかもしれません –

+0

しかし、JavaではStringを渡していますJavaのmyプロパティは文字列であるため、java.sql.Clobではなくjava.lang.Stringを使用します。私はsql-type = "CLOB"を追加しようとしています。それをテストします – Norbert94