2011-07-05 10 views
5

次の問題が発生しました。これはprettycommonのようです。例外はCannot update entity: [...] nested exception is java.sql.BatchUpdateException: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB columnです。 Oracleは、LOBまたはCLOBの後に大きな値(> 4000文字)をパラメータにバインドすることを好まないようです。誰かがこの問題を解決しましたか?HibernateとCLOBでの奇妙なOracleエラー

答えて

9

ORA-24816
**制限があり、LONGバインド変数は文の最後に付く必要があります。 **

ソース:http://www.odi.ch/weblog/posting.php?posting=496

ソリューション:CLOB列がアルファベット順にご注文時のVARCHAR2列よりも後に来る名前(を持つように休止状態モデル内のフィールドの名前を変更することで、私はのCLOBフィールドを接頭辞javaクラスの 'z'が)、clobパラメータがクエリのhibernateビルドのvarcharパラメータの後に来るため、すべて正常に動作します。

+1

私は、XMLマッピングされたエンティティと私はINSERT/UPDATE文の末尾にCLOBのを取得するための設定のプロパティの順序を変えることができることを見出しました。例えば。

2

Hibernate 3.2.1で同じ問題が発生し、まずCLOBなしでレコードを挿入し、そのレコードをCLOBで更新することで修正しました。

public class Employee{ 

    @Lob 
    @Column 
    private String description; 

    //getters setters 
} 

String desc = emp.getDescription(); 
emp.setDescription(null); 
session.save(entity); 
session.flush(); 
session.evict(entity); 

StringBuilder sb = new StringBuilder(); 
sb.append("update Employee set description:description"); 
Query updateQuery = session.createQuery(sb.toString()); 
updateQuery.setParameter("description", desc, Hibernate.STRING); 
updateQuery.executeUpdate(); 

Hibernateアノテーションを使用している場合、挿入文の列の順序を予測する方法はありません。これはHibernate v4.1.8で修正されました。

https://hibernate.atlassian.net/browse/HHH-4635