手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

在CMP实体BEAN中使用BLOB数据类型

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  在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);

  结论

  我们不能在CMP实体BEAN中直接映射 java.sql.Blob类型到数据库中的BLOB字段。而是要使用byte[]来操作BLOB数据类型。但是我们要值得注意的是,假如存储的数据很大(超过25M),那么这种方式的处理效率将很低,那时只能考虑其他可选的方案子。

  完整的代码范例能够从以下地址中得到:http://www.oracle.com/technology/tech/java/oc4j/904/how_to/how-to-ejb-cmpblob.zip

  


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS