2014-02-17 50 views
2

如何創建jlob對象到Clob。當我嘗試以下不可序列化錯誤時。JAXB對象到Clob

public static void createClob(TestTo testTo){ 
     PreparedStatement pst = null; 
     Connection con = null; 
     //Clob studentListClob = null;     

     try { 
      con = openOASDBcon(false); 
      pst = con.prepareCall(INSERT_Clob); 
      pst.setBytes(1, getByteArrayObject(testTo)); 
      pst.setString(2, ""); 
      pst.executeUpdate(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      close(con, pst); 
     } 
    } 


private static byte[] getByteArrayObject(TestTo testTo){ 

      byte[] byteArrayObject = null; 
      try { 

       ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       ObjectOutputStream oos = new ObjectOutputStream(bos); 
       oos.writeObject(testTo); 

       oos.close(); 
       bos.close(); 
       byteArrayObject = bos.toByteArray(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return byteArrayObject; 
      } 
      return byteArrayObject; 
     } 

這是不可能實現可序列化的。有什麼最好的方法來實現jbb對象clob。

+0

看來你可能會問如何讓JAXB創建Serializable類。如果是這種情況,請參閱http://stackoverflow.com/questions/1513972/how-to-generate-a-java-class-which-implements-serializable-interface-from-xsd-us – Rob

+0

不僅可序列化。我想將jaxb對象轉換爲clob。有什麼辦法嗎? – jackyesind

+0

@Rob。有什麼辦法可以做 – jackyesind

回答

0

有幾種方法可以將JAXB對象粘貼到數據庫中的CLOB(或BLOB)列中。我認爲你將不得不做一些自定義插入和選擇邏輯來將JAXB對象放入列中 - 正常的ORM模型將是每個對象的一行,並且每個對象的字段都有一列(例如,如果您使用的是休眠)。

選項1:配置xjc以生成可序列化的JAXB類(How to generate a Java class which implements Serializable interface from xsd using JAXB?)。然後使用Serializable接口從clob/blob的輸入/輸出流中讀取/寫入對象。這將Java對象表示存儲在數據庫中。

選項2:使用JAXB提供的XML編組/解組路徑將對象的狀態作爲XML文本讀取/寫入。這將對象的XML表示存儲在數據庫中。

我個人會選擇2 - XML表示。我認爲在XSD中管理更改會更容易,並確保您可以閱讀舊對象,而不必處理Java的序列版本ID。另外,您可能需要考慮在將XML放入CLOB之前先對XML進行壓縮(請參閱Compressing and decompressing streams)。