2013-05-20 48 views
7

Załóżmy, że mam klasy:konwersji String do Clob i vice versa w Hibernate

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

    public Clob getDataXML() { 
     return dataXML; 
    } 

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

i hibernacji mapowania xml:

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

W kodzie java, jak przekonwertować ciąg do Clob i vice versa, aby zapisać się do bazy danych:

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

mógłbyś pomóc jak wdrożyć funkcję convertStringToClob (Dane ciągu);

Dzięki,

Odpowiedz

5

Oto kod zrobiłem dawno temu przekonwertować Clob do String. Jest przeznaczony do użycia w klasie narzędziowej.

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

A jeśli się nie mylę, aby utworzyć Clob byś zrobić coś takiego

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

java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob nie można przesłać do oracle.sql.CLOB –

+0

Otrzymuję ten wyjątek: java.lang.ClassCastExcept ion: javax.sql.rowset.serial.SerialClob nie można przesłać do oracle.sql.CLOB –

+0

Interfejs importu Clob z java.sql.Clob, a drugi powinien być javax.sql.rowset.serial.SerialClob.Osobiście nigdy nie musiałem używać tego z hibernacją, użyłem adnotacji @Lob i na mojej tablicy zadeklarowałem kolumnę jako CLOB. –

11

Wykonaj

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

public String getDataXML() { 
    return dataXML; 
} 

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

Więc nie ma potrzeby konwertowania i wszystko jest wykonywane przez Hibernate.

Pokazałem to za pomocą adnotacji, to samo można zrobić przy użyciu plików .hbm.xml.

+0

Jeśli to zrobimy, problem z ograniczeniem 64k wystąpi. Chcę zapisać większy plik xml, np. Ciąg –

+3

A kto ogranicza Cię do 64k? –

+0

Wow uhm ... właśnie uratowałeś mi około 20 linii kodu, pamięć podręczną dla "de-clob-ed Strings" i obejście dla serializacji ... Po prostu pokazuje, że powinieneś znać swoje narzędzia (Hibernate) przed używając ich. Dzięki! – avalancha

0

Ograniczenie 64000 znaków jest po stronie bazy danych, gdy deklarujesz kolumnę XML jako VARCHAR (a nie na Java String), więc tak długo, jak długo twoja kolumna XML jest CLOB, powinno działać.

Fragment kodu robocza:

jednostki:

private String xml; 

SQL (Oracle):

XML  CLOB, 

Hibernacja mapowania:

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

Jeśli chcesz przechowywać XML jako plik, Następnie należy raczej używać BLOB, jak pokazano poniżej:

jednostki:

private byte[] xmlFile; 

SQL (Oracle):

XML  BLOB, 

hibernacji mapowanie:

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

Deklarowana kolumna XML to CLOB. Problem nadal się zdarza. –

+0

spróbuj zadeklarować pole dataXML w twojej klasie jako String (zamiast Clob); odpowiednio zmienić odwzorowanie XML. W powyższym fragmencie kodu (wyodrębnionym z działającego kodu) zamiast Clob po stronie Java używany jest ciąg –