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

博客围绕在CMP实体BEAN中使用BLOB数据类型展开。介绍了在Oracle等数据库中CLOB和BLOB类型用途,指出JDBC对应类型不能在实体BEAN使用,需用byte[]操作BLOB字段。给出EmployeePicture实体BEAN范例及映射代码,还提及客户端处理要点和大文件处理效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主题:在CMP实体BEAN中使用BLOB数据类型
作者:Debu Panda
翻译:蔡毅(
caiyi0903@hotmail.com
时间:2005-6-23

在Oracle这样的关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。

JDBC定义java类型java.sql.Clobjava.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, picturepicture 字段被定义成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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值