<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 66,  comments - 11,  trackbacks - 0
    Blob、Clob字段的映射
         Blob和Clob字段的區(qū)別在于,Blob字段采用單字節(jié)存儲(chǔ),適合保存二進(jìn)制數(shù)據(jù),如圖片文件。Clob字段采用多字節(jié)存儲(chǔ),適合保存大型文本數(shù)據(jù)。
         在Oracle中Blob/Clob字段獨(dú)特的訪問方式,Oracle Blob/Clob字段本身擁有一個(gè)游標(biāo),JDBC必須必須通過游標(biāo)對(duì)Blob/Clob字段進(jìn)行操作,在Blob/Clob字段被創(chuàng)建之前,我們無法獲取其游標(biāo)句柄,這也意味著,我們必須首先創(chuàng)建一個(gè)空Blob/Clob字段,再從這個(gè)空Blob/Clob字段獲取游標(biāo),寫入我們所期望保存的數(shù)據(jù)。

        實(shí)體粒度設(shè)計(jì):
        在Hibernate世界里,我們經(jīng)常聽到"fine-grained object model"直接翻譯就是適當(dāng)?shù)募?xì)粒度對(duì)象模型。
        適當(dāng)?shù)谋容^模糊,細(xì)粒度就是將原本業(yè)務(wù)模型中的對(duì)象加以細(xì)分,從而得到更加精細(xì)的對(duì)象模型。就是劃分出更多的對(duì)象。分為:面向設(shè)計(jì)的細(xì)粒度劃分和面向性能的細(xì)粒度劃分。
        對(duì)于單表的對(duì)象細(xì)分,在Hibernate中可借助Component節(jié)點(diǎn)的定義來完成。何謂Component?從名字上來看,既然稱之為組件,則其必然是從屬于某個(gè)整體的一個(gè)組成部分。在Hibernate語義中,我們將某個(gè)實(shí)體對(duì)象中的一個(gè)邏輯組成成為Component.Component與實(shí)體對(duì)象的根本差別,就在于Component沒有標(biāo)示,它作為一個(gè)邏輯組成,完全從屬于實(shí)體對(duì)象。通過Component定義,我們將T_User表實(shí)際映射到了3個(gè)類,TUser,Contact和Name,這樣我們就可以在傳統(tǒng)關(guān)系型庫表上,實(shí)現(xiàn)了面向?qū)ο蟮念I(lǐng)域劃分。
        面向性能的細(xì)粒度劃分:
        當(dāng)我們通過Hibernate加載TUser對(duì)象時(shí),Hibernate會(huì)從庫表中讀取所有的字段數(shù)據(jù),并構(gòu)造TUser實(shí)例返回。這里就產(chǎn)生了一個(gè)性能方面的問題,作為blob/clob等重量級(jí)字段類型,數(shù)據(jù)庫讀取操作代價(jià)較高。對(duì)于需要處理resume和image的應(yīng)用邏輯而言,這樣的代價(jià)無法避免,而對(duì)于那些無需resume和image信息的操作而言,如此性能無謂的損耗實(shí)在可惜。
        如何避免這個(gè)問題,Hibernate3提供了屬性的延遲加載功能,通過這個(gè)功能,我們可以在調(diào)用TUser.getResume/getImage時(shí)才真正從數(shù)據(jù)庫中讀取數(shù)據(jù)。對(duì)于hibernate2來說我們通過繼承關(guān)系,我們將一個(gè)對(duì)象進(jìn)行縱向細(xì)分來解決這個(gè)問題。我們通過在子類的映射文件中class節(jié)點(diǎn)指定polymorphism="explicit"聲明了一個(gè)顯示多態(tài)關(guān)系。聲明為顯示多態(tài)的類,只有在明確指定類名的時(shí)候才會(huì)返回此類實(shí)例。

      
    package com.wyq.hibernateLoad;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.sql.Blob;
    import java.sql.Clob;
    import java.sql.SQLException;

    import org.hibernate.Hibernate;
    import org.hibernate.LockMode;
    import org.hibernate.Session;
    import org.hibernate.Transaction;

    import com.wyq.hibernate.TUser2;

    public class TUserOperator {
        Session session 
    = null;
        
    //復(fù)合主鍵加載數(shù)據(jù)
        public void loadData(){
            TUser2 user 
    = new TUser2();
            user.setFirstname(
    "Kevin");
            user.setLastname(
    "Shark");
            user 
    = (TUser2)session.load(TUser2.class, user);
            System.out.println(
    "User age is=>"+user.getAge());
        }
        
    //SQL保存圖片
        public void saveImage(){
            TUser2 user 
    = new TUser2();
            user.setAge(
    new Integer(20));
            
            
    try {
                FileInputStream imgis 
    = new FileInputStream("C:\\inimage.jpg");
                
                Blob img 
    = Hibernate.createBlob(imgis);
                user.setImage(img);
                
                Clob resume 
    = Hibernate.createClob("This is Clob");
                user.setResume(resume);
                
                Transaction tx 
    = session.beginTransaction();
                
                session.save(user);
                tx.commit();
                
            } 
    catch (FileNotFoundException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
    catch (IOException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    //SQL讀取圖片
        public void getImageObj(){
            TUser2 user 
    = (TUser2)session.load(TUser2.class,new Integer(3));
            Clob resume 
    = user.getResume();
            Blob img 
    = user.getImage();
            
            
    try {
                InputStream is 
    = img.getBinaryStream();
                
                FileOutputStream fos 
    = new FileOutputStream("c:\\outimage.jpg");
                
    byte[] buf = new byte[102400];
                
    int len;
                
    while((len=is.read(buf))!=-1){
                    fos.write(buf,
    0,len);
                } 
                fos.close();
                is.close();
                
            } 
    catch (SQLException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
    catch (FileNotFoundException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
    catch (IOException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    //Oracle保存圖片
        public void saveForOracleImage(){
            TUser2 user 
    = new TUser2();
            user.setAge(
    new Integer(20));
            user.setImage(Hibernate.createBlob(
    new byte[1]));
            user.setResume(Hibernate.createClob(
    " "));//注意這里的參數(shù)是一個(gè)空格
            
            Transaction tx 
    = session.beginTransaction();
            
            session.save(user);
            
    //調(diào)用flush方法,強(qiáng)制Hibernate立即執(zhí)行insert sql
            session.flush();
            
    //通過refresh方法,強(qiáng)制Hibernate執(zhí)行select for update
            session.refresh(user, LockMode.UPGRADE);
            
            
    //向Blob寫入實(shí)際內(nèi)容
            oracle.sql.BLOB blob = (oracle.sql.BLOB)user.getImage();
            
    try {
                OutputStream out 
    = blob.getBinaryOutputStream();
                
                FileInputStream imgis 
    = new FileInputStream("c:\\inimage.jpg");
                
    byte[] buf = new byte[10240];//10k緩存
                int len;
                
    while((len=imgis.read(buf))>0){
                    out.write(buf,
    0,len);
                }
                imgis.close();
                out.close();
                
                
    //向CLOB寫入實(shí)際內(nèi)容
                oracle.sql.CLOB clob = (oracle.sql.CLOB)user.getResume();
                java.io.Writer writer 
    = clob.getCharacterOutputStream();
                writer.write(
    "this is my resume");
                writer.close();
                session.save(user);
                tx.commit();
            } 
    catch (SQLException e) {
                e.printStackTrace();
            }
    catch (FileNotFoundException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
    catch (IOException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
    }


        實(shí)體層次設(shè)計(jì):繼承關(guān)系是關(guān)系型數(shù)據(jù)與面向?qū)ο髷?shù)據(jù)結(jié)構(gòu)之間的主要差異之一。
        Hibernate中支持3種類型的繼承形式:
        1、表與子類之間的獨(dú)立一對(duì)一關(guān)系。
        2、每個(gè)子類對(duì)應(yīng)一張子表,并與主類共享主表
        3、表與類的一對(duì)多關(guān)系



      
    posted on 2009-10-27 22:32 王永慶 閱讀(227) 評(píng)論(0)  編輯  收藏 所屬分類: HIBERNATE
    <2009年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    關(guān)注blogs

    搜索

    •  

    最新評(píng)論

    • 1.?re: 心中的那個(gè)她[未登錄]
    • 如果心情能那么容易放開就好了,碰到她是我的緣分,但是她的緣分不知道在哪里。
    • --王永慶
    • 2.?re: 心中的那個(gè)她[未登錄]
    • 兄弟,喜歡就大膽去追好了,就是因?yàn)橄矚g才會(huì)有不愉快,如果想一輩子沒有這些煩惱,找一個(gè)可有可無的人就好了。這種事講的是緣分吧。別人對(duì)你好不好其實(shí)不太重要。放開心情就好了。
    • --萍水相逢
    • 3.?re: 心中的那個(gè)她
    • 只能同甘不能共苦,就他媽算了吧,程序員也是人??!我現(xiàn)在也很討厭女的不理解人情。
    • --咖啡妝
    • 4.?re: 難以割舍的那份情感
    • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
    • --王永慶
    • 5.?re: 難以割舍的那份情感
    • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
    • --隔葉黃鶯

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲尹人香蕉网在线视颅| 亚洲国产成人精品无码区二本| 男女免费观看在线爽爽爽视频| 亚洲男人的天堂网站| 亚洲人成精品久久久久| 性xxxxx免费视频播放| 国产黄在线观看免费观看不卡| 亚洲白色白色永久观看| 免费国产人做人视频在线观看| 久久大香伊焦在人线免费| 亚洲欧美日韩中文字幕在线一区| 国产亚洲大尺度无码无码专线| 97性无码区免费| 国内精品免费久久影院| 亚洲精品天堂在线观看| 国产精品亚洲成在人线| 在线免费观看一级片| 暖暖免费在线中文日本| 国产成人精品亚洲| 亚洲国产精品免费在线观看| 亚洲欧洲久久久精品| 97人伦色伦成人免费视频| 日本免费久久久久久久网站| 国产亚洲精品美女2020久久| 亚洲免费观看网站| 亚洲精品国产精品乱码视色| 成人永久免费福利视频网站| 久久99国产乱子伦精品免费| 新最免费影视大全在线播放| 亚洲中文字幕一二三四区| 亚洲人成电影亚洲人成9999网| 亚洲男人av香蕉爽爽爽爽| 真实乱视频国产免费观看 | 在线jyzzjyzz免费视频| 99精品在线免费观看| 中国一级毛片免费看视频| 国产精品亚洲va在线观看| 亚洲精品第一国产综合亚AV| 亚洲一区动漫卡通在线播放| 亚洲最新永久在线观看| 亚洲精品V欧洲精品V日韩精品|