2011-07-05 2 views
5

J'ai rencontré le problème suivant, qui semble être un prettycommon. L'exception est Cannot update entity: [...] nested exception is java.sql.BatchUpdateException: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column. Il semble qu'Oracle n'aime pas lier les grandes valeurs (> 4000 caractères) aux paramètres après un LOB ou un CLOB. Est-ce que quelqu'un a résolu ce problème?Étrange erreur Oracle avec Hibernate et CLOB

Répondre

9

Ceci est: ORA-24816
** C'est une limitation, et que les variables de liaison LONG doivent venir en dernier dans une déclaration. **

source: http://www.odi.ch/weblog/posting.php?posting=496

Solution: En renommant les champs dans le modèle de mise en veille prolongée afin que la colonne de clob a un nom qui vient plus tard que la colonne VARCHAR2 lors de la commande par ordre alphabétique (I préfixés le champ clob dans la Java classe avec un 'z'), tout fonctionne bien car alors le paramètre clob vient après le paramètre varchar dans la construction de la compilation hibernate.

+1

Je trouve que les entités mappées XML je pouvais changer l'ordre des propriétés dans la config pour obtenir les CLOBs à la fin de l'instruction INSERT/UPDATE. Par exemple. '' –

2

Nous avons rencontré le même problème avec Hibernate 3.2.1 et nous avons corrigé en insérant d'abord l'enregistrement sans CLOB puis en mettant à jour cet enregistrement avec les 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(); 

Si vous utilisez des annotations Hibernate, alors il n'y a aucun moyen de prédire l'ordre des colonnes dans l'instruction d'insertion. Cela a été corrigé dans Hibernate v4.1.8.

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