2017-09-27 2 views
0

J'ai ajouté une nouvelle colonne CLOB dans une table et modifié mon hbm.xml - fichier à utiliser cette nouvelle colonne (la vieille colonne était varchar2 et donc trop petite):Java_Hibernate 3_CLOB_ORA-01461

(je random- noms à des fins de démonstration)

<?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> 

comme vous pouvez le voir, mon clob-colonne (COLUMN_CLOB) est définie en dernier, parce que d'abord je suis arrivé cette exception:

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

Je recherchais cette erreur et la la solution était de p Lacer la liaison clob au dernier dans l'instruction insert, j'ai donc défini la colonne clob dans le fichier hbm.xml pour être le dernier, comme vous pouvez le voir ci-dessus.

Maintenant, je ne reçois pas l'exception ORA-24816, mais je reçois cette exception:

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

L'insertion-déclaration généré ressemble à ceci:

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

Comme vous avez pu le constater , la colonne COLUMN_CLOB n'apparaît pas en dernier dans l'instruction Insert-Statement générée. Je ne sais pas si l'ordre dans le fichier hbm-xml affecte l'ordre des colonnes dans l'instruction d'insertion générée?

Mais de toute façon, je ne reçois plus l'ORA-24816 juste ORA-01461. Je ne sais pas comment résoudre ce problème.

J'utilise Hibernate 3 et la version Oracle: Edition Enterprise version 11.2.0.4.0 - 64bit production

EDIT:

J'ai exactement le même problème que décrit ici: http://newtechnobuzzz.blogspot.ch/2014/07/ora-24816-expanded-non-long-bind-data.html#.Wcy-QdFpHRY

J'ai essayé les solutions suivantes:

  • Chanter l'ordre des méthodes getter et setter ne fonctionne pas
  • Modification de l'ordre de la propriété déclarée dans le -file hbm.xml ne fonctionne pas

Le problème décrit sur le lien et sur d'autres sites, affirment que cette excpetion se produit si vous essayez d'insérer des données dans les deux colonnes varchar2 et clob (2 chaînes d'une longueur de 4000). Cependant, j'insère seulement des données dans la colonne clob qui est plus grande que 4000. Je n'utilise plus l'ancienne varchar2-column.

Maintenant, j'essaie de résoudre ce problème en utilisant cette solution: Il peut être résolu en écrivant deux requêtes de mise à jour. Tout d'abord, enregistrez/mettez à jour l'entité par une requête de mise à jour, puis écrivez une autre requête pour mettre à jour les colonnes LOB de cette entité.

Cependant, je ne comprends pas très bien, comment je devrais modifier mon code.Ma méthode ressemble à ceci:

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

    getHibernateTemplate().saveOrUpdate(test); 

    return test; 
} 

Répondre

0

D'après ce que je peux voir, le type de propriété n'a pas été correctement déclarées pour la colonne CLOB, essayer:

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

Mais je sauve une chaîne. La chaîne est plus grande que 4000, c'est pourquoi je veux les enregistrer dans une colonne clob. Par conséquent, j'ai besoin d'utiliser java.lang String comme type droit? J'ai aussi d'autres tables qui ont clob-colonnes et sont déclarées comme java.lang.String dans le fichier hbm.xml et cela fonctionne – Norbert94

+0

je suppose qu'il y a une discordance entre le type de colonne et le type de données transmis à la colonne, peut-être vous devrait utiliser java.sql.Clob au lieu de java.lang.String Si cela fonctionne pour d'autres tables alors peut-être que c'est quelque chose avec l'ordre des colonnes entre le staement d'insertion et la déclaration de colonne –

+0

Mais en java je passe une chaîne, donc je ne peux pas utilisez java.sql.Clob mais java.lang.String car ma propriété en Java est une chaîne. J'essaie d'ajouter sql-type = "CLOB" et de le tester – Norbert94