posts - 17,  comments - 6,  trackbacks - 0
          在CMP實體BEAN中使用BLOB數據類型
          2005-07-19? ?來源:matrix.org.cn ?作者:matrix.org.cn
          摘要:
          在Oracle這樣的關系數據庫中,CLOB和BLOB類型被用來存放大對象。BOLB表示二進制大對象,這種數據類型通過用來保存圖片,圖象,視頻等。CLOB表示字符大對象,能夠存放大量基于字符的數據。JDBC定義java類型java.sql.Clob 和java.sql.Blob 對應數據庫中的CLOB和BLOB類型。然而這兩種類型并不能在實體BEAN中使用,因為這兩個類沒有被序列化(Serializable)。因此我們不能在CMP實體BEAN中定義java.sql.Clob或java.sql.Bl


          在Oracle這樣的關系數據庫中,CLOB和BLOB類型被用來存放大對象。BOLB表示二進制大對象,這種數據類型通過用來保存圖片,圖象,視頻等。CLOB表示字符大對象,能夠存放大量基于字符的數據。

          JDBC定義java類型java.sql.Clob 和java.sql.Blob 對應數據庫中的CLOB和BLOB類型。然而這兩種類型并不能在實體BEAN中使用,因為這兩個類沒有被序列化(Serializable)。因此我們不能在CMP實體BEAN中定義java.sql.Clob或java.sql.Blob這兩種數據類型。

          如果我們要使用數據庫的BLOB字段,我們必須在實體bean中聲明CMP字段為 byte[] 并映射該字段到數據庫的BLOB字段。如果要使用CLOB字段,我們需要使用定義CMP字段為 java.lang.String or char[] 。

          一個ENTITY的范例
          在一個企業里,處于安全考慮,我們也許要將員工的圖片保存到數據庫中的表里。這里我們使用EmployeePicture 作為范例來代表員工的圖片實體。這個EmployeePictureBean CMP有兩個屬性 empno, picture。 picture 字段被定義成byte[]型 。

          該EmployeePicture實體BEAN被映射到EMPPIC數據表, picture 屬性被映射為EMPPIC 表中的picture 字段,該picture字段是定義為BLOB類型的。

          下面是EmployeePictureBean.java的部分核心代碼:

          public abstract class EmployeePictureBean implements EntityBean
          {
          ? ....
          ? public abstract byte[] getPicture();
          ? public abstract void setPicture(byte[] newPicture);
          ? public Long ejbCreate(Long empno, byte[] newPicture)
          ? {
          ? ? setEmpno(empno);
          ? ? setPicture(newPicture);
          ? ? return empno;
          ? }

          ? public void ejbPostCreate(Long empno, byte[] newPicture)
          ? {
          ? }
          ? ...
          }


          如果我們使用OC4J 9.0.4 ,就需要在orion-ejb-jar.xml中定義實體BEAN屬性到數據表字段的映射。如果使用了其他J2EE容器,就需要在相關廠商的部署描述符中定義O-R映射。下面演示在OC4J中的映射代碼:

          <entity-deployment name="EmployeePicture" data-source="jdbc/OracleDS" table="EMPPIC">
          ? <primkey-mapping>
          ? ? <cmp-field-mapping name="empno" persistence-name="EMPNO" persistence-type="NUMBER(8)"/>
          ? </primkey-mapping>
          ? <cmp-field-mapping name="empno" persistence-name="EMPNO" persistence-type="NUMBER(8)"/>
          ? <cmp-field-mapping name="picture" persistence-name="PICTURE" persistence-type="BLOB"/>
          </entity-deployment>



          客戶端:
          CMP實體BEAN的客戶端沒有什么特別的處理。唯一需要注意的是在update數據表時要使用BufferedInputStream 來讀取IMAGE文件,但在檢索數據表時使用OutputStream 。

          下面演示如何讀取一個IMAGE文件,并創建一個BEAN實例:

           // Locate and open the file

          ? ? File imgFile = new File(fileName);

          ? ? long imgFileSize= imgFile.length();

          ? ? // initialize the byte array

          ? ? byte byteValue[] = new byte[(int)imgFileSize];

          ? ? // Read the file into the byte array

          ? ? InputStream is = new BufferedInputStream(new FileInputStream(imgFile));

          ? ? int len = is.read(byteValue);

          ? ? //Add the byte to the entity bean field

          ? ? if(len!=imgFileSize)

          ? ? {

          ? ? ? ? ? ?System.out.println("Read bytes did not equal file size on directory");

          ? ? }

          ? ? else

          ? ? {

          ? ? ? EmployeePictureLocal employeePicture = empHome.create(empNo , byteValue);

          posted on 2006-06-19 23:51 風中的舞者 閱讀(303) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          java技術

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新乡县| 富平县| 巴林右旗| 罗甸县| 西昌市| 德化县| 哈巴河县| 广安市| 江达县| 伊宁市| 青浦区| 修水县| 新乡市| 广安市| 正安县| 德昌县| 南溪县| 建宁县| 五原县| 青龙| 井研县| 双城市| 高陵县| 博罗县| 修武县| 布尔津县| 修文县| 长丰县| 左贡县| 建瓯市| 娱乐| 长岛县| 肥乡县| 瑞昌市| 聂拉木县| 翼城县| 天镇县| 深圳市| 安岳县| 织金县| 桑日县|