您的位置:首页 > 其它

hibernate如何对Blob类型字段进行数据添加

2013-03-28 17:59 751 查看
以前写过操作oracle Clob字段的方法,在的其它文章里有,现在介绍操作Blob字段的做法.

对于MS SQL和MYSQL数据库,操作Blob字段很简单,而对于oracle数据进行操作,则要复杂些,这是因为oracle访问Blob和Clob有它独特的方式,oracle Blob/Clob字段本身有一个游标(cursor),必须要通过这个游标对Blob/Clob进行操作,在Blob/Clob未创建前,我们无法获得它们的游标句柄,因此,我们必须先得创建一个空的Blob/Clob字段值,然后再从这个空的字段值取得游标句柄,再来进行我们的操作.前面那篇文章的操作方式就是这样的,不是很清楚的,可以结合以前的那篇来看,Blob和Clob的操作方式大体上相同.

hbm.xml

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

" http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

<class name="hibernate.Blobtest" table="blobtest" catalog="hbtplis">

<id name="id" type="java.lang.Long">

<column name="id" />

<generator />

</id>

<property name="images" type="java.sql.Blob">

<column name="images" />

</property>

<property name="name" type="java.lang.String">

<column name="name" />

</property>

</class>

</hibernate-mapping>

pojo:

package hibernate;

import java.sql.Blob;

/**

*

* @author coffee

*/

public class Blobtest implements java.io.Serializable {

private Long id;

private Blob images;

private String name;

public Blobtest() {

}

public Blobtest(Blob images, String name) {

this.images = images;

this.name = name;

}

public Long getId() {

return this.id;

}

public void setId(Long id) {

this.id = id;

}

public Blob getImages() {

return this.images;

}

public void setImages(Blob images) {

this.images = images;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

}

DAO:

package hibernate;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.sql.Blob;

import org.hibernate.Hibernate;

import org.hibernate.LockMode;

import org.hibernate.Transaction;

/**

*

* @author coffee

*/

public class BlobtestDAO extends BaseHibernateDAO {

public void save(Blobtest blobtest) throws Exception {

try {

/*

* 第一种方式,可用于ms sql和mysql数据库

Transaction tran=getSession().beginTransaction();

FileInputStream img = new FileInputStream("d:\\movie\\linux4.jpg");

Blob images = (Blob) Hibernate.createBlob(img);

blobtest.setImages(images);

getSession().save(blobtest);

tran.commit();

*/

//对于oracle这样的数据库不能以第一种方式那样,必须向下面这样操作

Transaction tran=getSession().beginTransaction();

blobtest.setImages(Hibernate.createBlob(new byte[1]));

getSession().save(blobtest);

getSession().flush();

getSession().refresh(blobtest,LockMode.UPGRADE);

Blob blob=blobtest.getImages();

InputStream is=blob.getBinaryStream();

FileOutputStream fos=new FileOutputStream("d:\\pic\\linux4.jpg");

byte[] buf=new byte[102400];

int len;

while((len=is.read(buf))!=-1){

fos.write(buf,0,len);

}

fos.close();

is.close();

getSession().save(blobtest);

tran.commit();

} catch (RuntimeException re) {

throw re;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: