2013-05-20 21 views
7

Supponiamo che ho una classe:Conversione di stringhe in Clob e viceversa in Hibernate

class EventTransaction { 
    ..... 
    private Clob dataXML; 

    public Clob getDataXML() { 
     return dataXML; 
    } 

    public void setDataXML(Clob dataXML) { 
     this.dataXML = dataXML; 
    } 
} 

e Hibernate mappatura xml:

<property name="dataXML" type="java.sql.Clob"> 
     <column name="XML" sql-type="CLOB"/> 
</property> 

Nel codice Java, come posso convertire una stringa in Clob e viceversa per salvare in al database:

Ex: EventTransaction et = new EventTransaction(); 
    String xml = "fdfsafafafa"; 
    et.setDataXML(convertStringToClob(xml)); 
    HibernateTemplate.saveOrUpdate(et); 

la prego di aiutare come implementare la funzione convertStringToClob (dati stringa);

Grazie,

risposta

5

Ecco codice che ho fatto molto tempo fa per convertire un Clob in una stringa. È pensato per essere utilizzato in una classe di utilità.

public static String convertClobToString(Clob clob) throws IOException, SQLException { 
      Reader reader = clob.getCharacterStream(); 
      int c = -1; 
      StringBuilder sb = new StringBuilder(); 
      while((c = reader.read()) != -1) { 
       sb.append(((char)c)); 
      } 

      return sb.toString(); 
    } 

E se non mi sbaglio, per creare un Clob si dovrebbe fare qualcosa di simile

 Clob myClobFile = new SerialClob("my string".toCharArray()); 
+0

java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob non può essere lanciato su oracle.sql.CLOB –

+0

Ricevo questa eccezione: java.lang.ClassCastExcept ion: javax.sql.rowset.serial.SerialClob non può essere lanciato su oracle.sql.CLOB –

+0

Importare l'interfaccia Clob da java.sql.Clob e l'altra dovrebbe essere javax.sql.rowset.serial.SerialClob.Personalmente non ho mai dovuto usarlo con l'ibernazione, ho usato l'annotazione @Lob e sulla mia tabella ho dichiarato la colonna come CLOB. –

11

Fate questo

@Column(name='xml') 
@Lob 
private String dataXML; 

public String getDataXML() { 
    return dataXML; 
} 

public void setDataXML(String dataXML) { 
    this.dataXML = dataXML; 
} 

Quindi non c'è bisogno di convertire, e tutto è fatto da Hibernate.

L'ho mostrato usando annotazioni, la stessa cosa può essere fatta usando i file .hbm.xml.

+0

Se lo facciamo, avremo problemi con la limitazione 64k. Voglio salvare un file xml più grande come la stringa –

+3

E chi ti limita a 64k? –

+0

Wow uhm ... mi hai appena salvato circa 20 righe di codice, una cache per "stringhe de-clob-ed" e una soluzione alternativa per la serializzazione ... Vado solo a mostrarti che dovresti conoscere i tuoi strumenti (Hibernate) prima usando loro. Grazie! – avalancha

0

La limitazione di 64000 caratteri si trova sul lato del database quando si dichiara la colonna XML come VARCHAR (e non su Java String), quindi se la colonna XML è un CLOB, dovrebbe funzionare.

Estratto dal codice di lavoro:

Entity:

private String xml; 

SQL (Oracle):

XML  CLOB, 

Hibernate mappatura:

<property name="xml" type="java.lang.String"> 
    <column name="XML" length="999999" /> 
</property> 

Se si desidera memorizzare il XML come file, allora si dovrebbe invece usare BLOB come illustrato di seguito:

Entity:

private byte[] xmlFile; 

SQL (Oracle):

XML  BLOB, 

Hibernate mappatura:

<property name="xmlFile" type="java.io.File"> 
    <column name="XML" /> 
</property> 
+0

Ho dichiarato che la colonna XML è CLOB. Il problema è ancora accaduto. –

+0

prova a dichiarare il campo dataXML nella tua classe come String (invece di Clob); modificare la mappatura XML di conseguenza. Nello snippet di codice sopra (estratto dal codice di lavoro) viene utilizzata una stringa al posto di Clob sul lato Java –