JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
己加入精華區
by koji at 2007-07-31 12:30
本主題所含的標籤
無標籤
作者 [教學] 使用 Hibernate 新增 Blob 到 Oracle [精華]
emt2a7





發文: 71
積分: 3
於 2007-07-25 17:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
前言
1. 本來是一邊參考前輩們的教學文件,我一邊來實作,但是我卻發生無法實作出來的狀況。
2. 於是,我多次從網路上到處尋找解答,最後很幸運的,解決了我的問題。
3. 以下,僅供參考,但可以確定的是:小弟我親自實作過且是執行成功的。
4. 如有任何錯誤,敬請指教。

測試環境(當時使用的)
1. Windows XP SP2。
2. Tomcat 5.0.28。
3. JDK 1.5。
4. Oracle 9i。
5. Hibernate 3.2.4。
6. Eclipse 3.0.1。

檔案列表(只列出重要的檔案)
1. hibernate.cfg.xml。      (設定資料庫連接以及物件與資料庫表格映射文件)
2. TestUser3.hbm.xml。     (物件與資料庫表格映射文件)
3. TestUser3.java。       (與資料庫對應的類別檔)
4. StartHibernate_insertBlob.java。(測試程式)(重點在此)

各個檔案內容(必須對Hibernate有基本認識)

1. hibernate.cfg.xml。(只列出映射文件的路徑)

1
2
3
4
5
6
7
<hibernate-configuration>
  <session-factory>
  .....
  <mapping resource="com/Achi/orm/sample02/TestUser3.hbm.xml"/>
  .....
 </session-factory>
</hibernate-configuration>


2. TestUser3.hbm.xml。(用一個 String,一個 Blob 來當範例)

1
2
3
4
5
6
<hibernate-mapping>
 <class name="com.Achi.orm.sample02.TestUser3" table="test_user3">
  <property name="name"    type="java.lang.String"  column="name"/>
  <property name="image"   type="java.sql.Blob"     column="image"/>
 </class>
</hibernate-mapping>


3. TestUser3.java。(很簡單,也就是 setXXX,getXXX 的方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.Achi.orm.sample02;
import java.sql.Blob;
public class TestUser3 {
  private String name;
  private Blob image;
  
  public TestUser3() {}
 
  public void setName(String newValue) { this.name = newValue; }
  public String getName()              { return this.name;     }
  
  public void setImage(Blob newValue) { this.image = newValue; }
  public Blob getImage()              { return this.image;     }
}


4. StartHibernate_insertBlob.java。(忽略Exception,rollback等步驟,重點在新增 Blob 那段)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.Achi.orm.sample02;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import oracle.sql.BLOB;
import org.hibernate.lob.SerializableBlob;
import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
 
public class StartHibernate_insertBlob {
 
  // 程式進入點
  public static void main(String args[]) {
  
    // --------------------------------------------------------------
    // 變數宣告
    // --------------------------------------------------------------
    File file = null;
    FileInputStream fileInputStream = null;
    String imagePath = "C:\\test_Blob_03.JPG";
    SessionFactory sessionFactory = null;
    Session session = null;
    Transaction tx = null;
    
    try {
      // ------------------------------------------------------------
      // [匯入] 圖檔
      // ------------------------------------------------------------
      file = new File(imagePath);
      fileInputStream = new FileInputStream(file);
      
      // ------------------------------------------------------------
      // [初始化] Blob
      // ------------------------------------------------------------      
      TestUser3 bean = new TestUser3();
      bean.setImage(Hibernate.createBlob(new byte[1]));
 
      // ------------------------------------------------------------
      // [設定] Name 
      // ------------------------------------------------------------      
      bean.setName("Achi");
      
      // ------------------------------------------------------------
      // [建立] Configuration 來管理 hibernate.cfg.xml 
      // ------------------------------------------------------------
      Configuration config = new Configuration().configure();
      
      // ------------------------------------------------------------
      // [建立] SessionFactory
      // ------------------------------------------------------------
      sessionFactory = (SessionFactory) config.buildSessionFactory();
      
      // ------------------------------------------------------------
      // [建立] Session
      // ------------------------------------------------------------
      session = sessionFactory.openSession();
      
      // ------------------------------------------------------------
      // [建立] Transaction
      // ------------------------------------------------------------
      tx = session.beginTransaction();
      
      // ------------------------------------------------------------
      // [儲存]
      // ------------------------------------------------------------
      session.save(bean);
      
      // ------------------------------------------------------------
      // [強制] flush,主要是先讓 Hibernate 去 insert 空欄位先。 
      // ------------------------------------------------------------
      session.flush();
      
      // ------------------------------------------------------------
      // [執行] refresh,讓 Hibernate 執行 Select For Update。
      // ------------------------------------------------------------
      session.refresh(bean, LockMode.UPGRADE);
      
      // ------------------------------------------------------------
      // [真正] 要寫入的 Blob 資料
      // ------------------------------------------------------------
      SerializableBlob sBlob = (SerializableBlob)bean.getImage();
      BLOB blob = (BLOB)sBlob.getWrappedBlob();
      OutputStream os = blob.getBinaryOutputStream();   
      byte[] data = new byte[(int)fileInputStream.available()];
      fileInputStream.read(data);
      os.write(data);
 
      // ------------------------------------------------------------
      // [強制] flush
      // ------------------------------------------------------------
      session.flush();
      
      // ------------------------------------------------------------
      // COMMIT
      // ------------------------------------------------------------
      tx.commit();
      
      // ------------------------------------------------------------
      // CLOSE
      // ------------------------------------------------------------
      fileInputStream.close();
      os.close();
      session.close();
      sessionFactory.close();
            
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}


5. SQL Command。

1
2
3
4
5
CREATE TABLE test_user3 (
  name    VARCHAR2(10) NOT NULL,
  image   BLOB,
  PRIMARY KEY (name)
)


emt2a7 edited on 2007-07-25 17:21
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
3628 [精華] [教學] 使用 Hibernate 新增 Blob 到 Oracle emt2a7 6277 2007-07-25 17:01
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8