首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate 中Blob字段的应用

2012-11-05 
Hibernate 中Blob字段的使用猫咪以前发了一个关于在Hibernate中使用Clob字段的文章。可以做到以String的方

Hibernate 中Blob字段的使用
猫咪以前发了一个关于在Hibernate中使用Clob字段的文章。可以做到以String的方式,直接把大量文字写入字段中而不用进行复杂编码。现在猫咪把使用Blob的方法也写出来。猫咪很懒,所以很久没有更新博客了。大家多多包涵!下面是猫咪的例子(仍然使用Oracle,请确保使用最新的JDBC驱动)首先建立一个数据库表

create table textblob (tid number(38,0),lob blob)

然后建立对应的Java对象

?

?

注意配置文件中“hibernate.jdbc.use_streams_for_binary”这个部分。这是Oracle必须添加的属性。其它配置没有什么特别的。SQL Server不需要这个属性。同时配置文件配置了一个C3P0数据库连接池。

?

映射文件如下:

?

然后就可以测试一下了。写一个运行的测试类Run.class。

</pre><p>?</p><p>因为Oracle JBDC不允许流操作以批量方式执行.</p><p>然后</p><p>测试类里面可以写:</p><pre name='code' class='java'>testblob test = new testblob();   
test.setId(5);  
test.setLob(Hibernate.createBlob(new byte[1])); 
Transaction t = session.beginTransaction();  
session.save(test);  
//调用flush方法,强制Hibernate立即执行 sql 语句
session.flush();
//通过refresh方法,强制Hibernate执行select for update
session.refresh(test,LockMode.UPGRADE);
//向Blob写入实际内容
oracle.sql.BLOB blob=(oracle.sql.BLOB)test.getLob();
OutPutStream out =blob.getBinaryOutputStream();
FileInputStream imgis=new FileInputStream("xx.jpg");
byte[] buf = new byte[10240];//10k缓存
int len=0;
while((len=imgis.read(buf))&gt;0){
out.write(buf,0,len);
}
imgis.close();
out.close();
session.save(test);
t.comit();

</pre><p>?</p></pre><p>?</p><p>因为Oracle JBDC不允许流操作以批量方式执行.</p><p>然后</p><p>测试类里面可以写:</p><pre name='code' class='java'>testblob test = new testblob();  
test.setId(5);  
test.setLob(Hibernate.createBlob(new byte[1])); 
Transaction t = session.beginTransaction();  
session.save(test);  
//调用flush方法,强制Hibernate立即执行 sql 语句
session.flush();
//通过refresh方法,强制Hibernate执行select for update
session.refresh(test,LockMode.UPGRADE);
//向Blob写入实际内容
oracle.sql.BLOB blob=(oracle.sql.BLOB)test.getLob();
OutPutStream out =blob.getBinaryOutputStream();
FileInputStream imgis=new FileInputStream("xx.jpg");
byte[] buf = new byte[10240];//10k缓存
int len=0;
while((len=imgis.read(buf))&gt;0){
out.write(buf,0,len);
}
imgis.close();
out.close();
session.save(test);
t.comit();

</pre><p>?</p></div><p><br/>很可惜。这么写是错误的。</p><p>Hibernate.createBlob(new byte[1]))生成的BLOB根本无法转化成Oracle的BLOB。它们虽然都继承自BLOB,但是不能强行转换。这种写法只适用于Hibernate2,3以后是不能用的。如果不想用我的方法,那么只能自己写Hibernate类型或使用Spring提供的类型。但是这样一来增加了难度或和Spring紧耦合了。</p><p>还有,你的写法造成了代码和数据库的紧耦合。也就是说如果更换数据库,那么必须修改代码。同时在Hibernate配置中关闭了批处理,造成系统整个性能下降。可以说是得不偿失。</p><p>深入浅出Hibernate我记得应该是一本比较早期的Hibernate参考书,上面的很多东西已经不适用于最新的Hibernate版本了。</p> 8 楼 魔力猫咪 2008-02-02   我去卓越网看了一下你说的那本书的介绍。在章节目录中有“移植到Hibernate 3 ”这么一章。虽然在简介里没有说明介绍的Hibernate的版本,但是通过这章,可以很明显看出介绍的是Hibernate2。
Hibernate2到Hibernate3可以说是一个飞跃。所以不要把Hibernate2的实践直接套用在3上。请在写代码的时候,自己先在机器上运行一下。

热点排行