今天书上让用ORACLE数据库建表,有个CLOB类型,,不知道到底怎么保存,用String也不行,,当时就怒了。。。
注意:目前只能操作Clob,因为不想用Session直接操作!
Clob在数据库中一般都是用来保存大文本字段的,Blob则是保存二进制流这样的!
1、Hibernate操作Clob字段
A.在实体Bean中将Clob字段声明为String类型。
并声明get,set方法。
B.在实体Bean XML的配置文件中,将Clob字段类型为:text
C.在Oracle中,表字段的类型声明为:Clob。
那么在实际的操作中,java就吧相当于直接操作String类型并保存在Oracle的Clob中。
下面附带代码片段。
2.Hibernate 保存blob数据
Clob在数据库中一般都是用来保存大文本字段的,Blob则是保存二进制流这样的!
1、Hibernate操作Clob字段
A.在实体Bean中将Clob字段声明为String类型。
并声明get,set方法。
B.在实体Bean XML的配置文件中,将Clob字段类型为:text
C.在Oracle中,表字段的类型声明为:Clob。
那么在实际的操作中,java就吧相当于直接操作String类型并保存在Oracle的Clob中。
下面附带代码片段。
- //声明Bean中的Clob字段类型为String,属性名不一定要是clob。这里我顺便取的,呵呵
- privateStringclob;
- publicStringgetClob(){
- returnclob;
- }
- publicvoidsetClob(Stringclob){
- this.clob=clob;
- }
- <propertyname="clob"column="clob"type="text"/>
- <!--在XXX.hbm.xml中,设置类型为text-->
- <propertyname="clob"column="clob"type="text"/>
- inter.setClob("大文本!");
2.Hibernate 保存blob数据
- //使用Session的方式保存
- Sessionsession=service.getCurrSession();
- Transactiontran=session.beginTransaction();
- //首先定义一个空的blob对象保存在数据库中inter.setPhoto(Hibernate.createBlob(newbyte[100]));
- session.save(inter);
- session.flush();session.refresh(inter,LockMode.UPGRADE);
- SerializableBlobsb=(SerializableBlob)inter.getPhoto();
- //photo是图片的byte数组的形式
- byte[]photo=(byte[])intermap.get("photo");
- BLOBblob=(BLOB)sb.getWrappedBlob();
- //将某个文件读入后,写到Blob字段的输出流中
- OutputStreamos=blob.getBinaryOutputStream();
- InputStreamfis=newByteArrayInputStream(photo);
- byte[]buff=newbyte[fis.available()];
- fis.read(buff);
- fis.close();
- os.write(buff);
- os.close();
- session.flush();
- /**
- *使用Session操作大字段分为3步
- *1、设置一个空的Clob/Blob保存到数据库中
- *inter.setPhoto(Hibernate.createBlob(newbyte[100]));
- *2、获得数据库中这个大字段的游标(Clob/Blob的cursor)
- *session.refresh(inter,LockMode.UPGRADE);
- *3、用cursor往数据库写数据
- *OutputStreamos=blob.getBinaryOutputStream();
- *InputStreamfis=newByteArrayInputStream(photo);
- *byte[]buff=newbyte[fis.available()];
- *fis.read(buff);
- *fis.close();
- *os.write(buff);
- *os.close();
- *session.flush();
- **/