在CMP实体BEAN中使用BLOB数据类型
2008-02-23 09:40:20来源:互联网 阅读 ()
主题:在CMP实体BEAN中使用BLOB数据类型
作者:Debu Panda
翻译:蔡毅(caiyi0903@hotmail.com)
时间:2005-6-23
在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://image.21tx.com/files/20050623/13743.zip.
上一篇: 一个如何从某一天格式(2005-12-31)得到该天的下一天格式(2006-01-01)的函数
下一篇: 在 JMeter 压力测试工具中使用变量
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash