2013-05-20 2 views
7

Angenommen, dass ich eine Klasse haben:convert String zu Clob und umgekehrt in Hibernate

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

    public Clob getDataXML() { 
     return dataXML; 
    } 

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

und Mapping-xml Hibernate:

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

In Java-Code, wie ich einen String zu Clob konvertieren und umgekehrt speichern in auf die Datenbank:

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

Könnten Sie bitte helfen, wie Funktion zu implementieren convertStringToClob (String-Daten);

Danke,

Antwort

5

Hier ist der Code habe ich vor langer Zeit eine Clob in einen String zu konvertieren. Es soll in einer Utility-Klasse verwendet werden.

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(); 
    } 

Und wenn ich mich nicht täusche, ein Clob erstellen Sie so etwas wie dieses

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

java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob kann nicht in oracle.sql.CLOB umgewandelt werden –

+0

Ich erhalte diese Ausnahme: java.lang.ClassCastExcept ion: javax.sql.rowset.serial.SerialClob kann nicht nach oracle.sql.CLOB umgewandelt werden. –

+0

Die Clob-Schnittstelle von java.sql.Clob importieren und die andere sollte javax.sql.rowset.serial.SerialClob sein.Persönlich musste ich das nie mit Hibernate verwenden, ich habe die @Lob-Annotation verwendet und auf meiner Table die Spalte als CLOB deklariert. –

11

Tun Sie dies

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

public String getDataXML() { 
    return dataXML; 
} 

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

So gibt es keine Notwendigkeit zu konvertieren, und alles tun würde, wird von Hibernate erledigt.

Ich zeigte es mit Anmerkungen, das gleiche kann mit .hbm.xml Dateien getan werden.

+0

Wenn wir das tun, werden wir Problem mit 64 KB Beschränkung bekommen. Ich möchte eine größere XML-Datei wie Zeichenfolge speichern –

+3

Und wer beschränkt Sie auf 64k? –

+0

Wow ähm ... du hast mir gerade 20 Codezeilen, einen Cache für "de-clob-ed Strings" und einen Workaround für die Serialisierung gerettet ... Zeigt dir einfach, dass du deine Tools (Hibernate) vorher kennen solltest benutze sie. Vielen Dank! – avalancha

0

Die Beschränkung von 64000 Zeichen ist auf der Datenbankseite, wenn Sie die XML-Spalte als VARCHAR (und nicht als Java-Zeichenfolge) deklarieren. Solange Ihre Spalten-XML ein CLOB ist, sollte sie funktionieren.

Auszug aus Arbeitscode:

Entity:

private String xml; 

SQL (Oracle):

XML  CLOB, 

Hibernate Mapping:

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

Wenn Sie die gespeichert werden sollen XML als Datei, dann sollten Sie lieber BLOBs verwenden, wie unten dargestellt:

Entity:

private byte[] xmlFile; 

SQL (Oracle):

XML  BLOB, 

Hibernate Mapping:

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

Ich deklarierte XML-Spalte ist CLOB. Das Problem ist immer noch passiert. –

+0

versuchen Sie, das dataXML-Feld in Ihrer Klasse als String (anstelle von Clob) zu deklarieren; Ändern Sie das XML-Mapping entsprechend. Im obigen Codefragment (aus dem Arbeitscode extrahiert) wird auf der Java-Seite statt Clob String verwendet –