hibernate对Blob类型字段进行数据添加
2011-02-10 03:24
483 查看
对于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 class="native" />
</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;
}
}
}
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 class="native" />
</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;
}
}
}
相关文章推荐
- hibernate如何对Blob类型字段进行数据添加
- hibernate查询数据表char类型字段只返回一个字符
- Struts2直接下载从数据中的blob类型字段( Struts2.0下载文件流)
- 使用 SQL Server 2008 数据类型-xml 字段类型参数进行数据的批量选取或删除数据
- CodeFirst进行数据迁移之添加字段
- 使用Hibernate存取大对象数据类型(clob和blob)
- hibernate生成表中有BLOB字段的javabean,hql查询出现无效列类型异常
- Hibernate读写Clob和Blob类型字段
- Kettle 生成的XML格式数据保存到Oracle 数据库的BLOB类型字段中
- hibernate中映射blob数据类型的一个例子
- Hibernate实现Oracle Blob/Clob类型数据读写
- 【转】hibernate oracle blob数据类型的处理
- 使用 hibernate 存取大对象数据类型(clob和blob)
- [随记]在Hibernate中如何使用Blob数据类型
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
- Oracle将某varchar2类型的字段改为blob类型时,报错:ORA-22858: 数据类型的变更无效
- Hibernate存储,读取大字段类型数据
- 使用 hibernate 存取大对象数据类型(clob和blob)
- 处理Blob类型数据,例如将对象保存到blob字段中
- JPA学习笔记---JPA实体Bean的建立---链接上一个博文:对实体Bean中属性进行操作:保存日期类型,设置字段的长度,名字,是否为空,可以声明枚举字段;可以存放二进制数据,可以存放