用JDBC操作Blob最基本的思路是:先插入一條包含空Blob的記錄,然後立即將該條記錄用行鎖定的方式開啟,得到改Blob欄位的引用,從中得到一個輸出資料流,將byte[]資料寫入後提交。hibernate操作的基本思路也是一致的。
參考url:
http://biekwo.iteye.com/blog/323393
http://bbs.csdn.net/topics/60009941
由於如果不是使用oracle 操作 blob,會報 不支援新特性的錯誤
robbin的這篇也可以
http://www.iteye.com/topic/254
這是另一個思路,但是我沒有實驗成功
http://bbs.csdn.net/topics/220063661
如果報這個錯誤
不允許的操作: streams type cannot be used in batching
參考這個url
http://hsyd.iteye.com/blog/320579
My Code
1 publicint add(User u) { 2 3 // TODO Auto-generated method stub 4 5 try{ 6 7 //擷取資料id 8 9 10 11 u.setId(GetMax());12 //空的blob13 u.setImage(Hibernate.createBlob(newbyte[1]));14 Session session = sessionFactory.openSession();15 16 transaction = session.beginTransaction();17 session.save(u);18 19 session.flush();20 21 session.refresh(u,LockMode.UPGRADE);22 23 //擷取引用24 25 SerializableBlob sb = (SerializableBlob)u.getImage(); 26 27 BLOB blob = (oracle.sql.BLOB)sb.getWrappedBlob(); 28 29 OutputStream out =((oracle.sql.BLOB)blob).getBinaryOutputStream(0);30 31 32 33 34 35 File file = new File("/Users/apple/Downloads/project.png"); 36 37 FileInputStream fis = new FileInputStream(file); 38 39 byte[] buff = newbyte[fis.available()]; 40 41 fis.read(buff); 42 43 fis.close(); 44 45 out.write(buff); 46 47 out.close();48 49 50 51 // When done close the streams52 53 54 55 //56 57 session.flush();58 59 //60 61 transaction.commit();62 63 System.out.println("save success");64 65 }catch(Exception e){66 67 System.out.println(e.getMessage());68 69 return 0;70 71 }72 73 return 1;74 75 }