使用Hibernate向ORACLE数据库保存Blob字段的问题 这是ORACLE数据库的特殊地方,向ORACLE存储Blob类型的字段时,必须如此操作,先插入一条空,然后取出来再插入实际的内容。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 tempP.setImage(Hibernate.createBlob(new byte[1])); 之后要行锁定。 你再对照我给你的那个教程。不过那个教程是clob的相信和blob原理一样的 sess.refresh(mh, LockMode.UPGRADE); 完整例子见下public class MeetingHeadDAOHibernate extends BaseDAOHibernate implements MeetingHeadDAO {/** * @author CZF * Description:创建一个新的会议记要 */ public Serializable createMeetingHead(MeetingHead mh) throws DAOException { try { Session sess = HibernateHelper.currentTransaction(); Serializable result = sess.save(mh); sess.flush(); //初始化SummaryClob字段 oracle.sql.CLOB clob = oracle.sql.CLOB.empty_lob(); mh.setSummaryClob(clob); /*也可采用此方法进行初始化 mh.setSummaryClob (Hibernate.createClob("")); */ //此处一定要用lockMode.UPGRADE模式进行锁定刷新 sess.refresh(mh, LockMode.UPGRADE); //获取MeetingHead实体的SummaryClobString属性值 String content = mh.getSummaryClobString(); //将获取的辅助字段的值通过oracle.sql.CLOB的putString()方法赋 值给实体内的summaryClob字段 oracle.sql.CLOB clob = (oracle.sql.CLOB) mh.getSummaryClob(); clob.putString(1, content);………… HbernateHelper.endCurrentTransaction(); return result; 官方实例见这里:http://www.hibernate.org/56.html try { tx = session.beginTransaction(); //执行事务 newPhoto tempP=new newPhoto(); //先建立空的栏位 tempP.setImage(Hibernate.createBlob(new byte[1])); System.out.println("开始保存空newPhoto"); session.save(tempP); System.out.println("保存空newPhoto完毕"); // 执行flush,让Hibernate INSERT 空栏位 session.flush(); System.out.println("flush()完毕"); // 执行refresh,让Hibernate执行SELECT FOR UPDATE session.refresh(tempP, LockMode.UPGRADE); //当你锁定记录后 就通过这个对象获得他的 Blob; //xxx是你那个Blob 的字段 oracle.sql.BlOB clob = (oracle.sql.BlOB ) tempP.getXXX(); //然后获得流. //后面是什么我也记不太清楚. 你点出来看一下就是那个返回writer对象的就是了。 java.io.Writer pw = blob.getXXXXXXXXXXXX(); pw.writer(你的字节数组); pw.close(); //提交事物就可以了.不要再次save()了 tx.commit(); flag=true; } 谢谢楼上各位,问题已经解决。但不是按照楼上两位大哥的方法。其实我的代码没有错,而是newPhoto实例中,有个title的属性,当时在映射文件中是这样定义的:<property name="title" column="title" type="string" not-null="true" /> 它定义为非空,因此我在保存空的tempP时,只设定了image属性,未设定title属性,所以存不进去。改成如下这样就可以了: Session session= HibernateSessionFactory.getSession(); Transaction tx=null; Boolean flag=false; try { tx = session.beginTransaction(); //执行事务 newPhoto tempP=new newPhoto(); //先建立空的栏位 tempP.setTitle("a"); tempP.setImage(Hibernate.createBlob(new byte[1])); System.out.println("开始保存空newPhoto"); session.save(tempP); System.out.println("保存空newPhoto完毕"); // 执行flush,让Hibernate INSERT 空栏位 session.flush(); System.out.println("flush()完毕"); // 执行refresh,让Hibernate执行SELECT FOR UPDATE session.refresh(tempP, LockMode.UPGRADE); System.out.println("refresh()完毕"); tempP=p; session.save(tempP); tx.commit(); flag=true; } 只是奇怪的是,在后台没有输出错误信息。后来我把异常打印出来了: catch (Exception e) { //如果出现异常,就撤销事务 e.printStackTrace(); if (tx!=null) tx.rollback(); throw e; }这才发现问题。不过无论如何也要谢谢楼上各位的热心! 关于默认页面的问题 请教Win 7系统下安装java_ee_sdk-5_08-jdk-6u18-windows怎么定义环境变量啊? spring+hibernate管理的service方法,内存溢出 《视频教程》整合Struts + Spring + Hibernate struts2 中打开页面问题 大家来帮帮~ 再问!!!怎样在Tomcat5.5下配置二级域名? 我用那一种服务器好?? 100分!如果需要同时插入30到50条记录JDBC的事务该如何处理? 第一次配B/S系统!tomcat+mysql网站不运行! 关于struts 的property struts返回值
之后要行锁定。 你再对照我给你的那个教程。不过那个教程是clob的相信和blob原理一样的 sess.refresh(mh, LockMode.UPGRADE);
public class MeetingHeadDAOHibernate extends BaseDAOHibernate
implements MeetingHeadDAO {
/**
* @author CZF
* Description:创建一个新的会议记要
*/
public Serializable createMeetingHead(MeetingHead mh)
throws DAOException {
try {
Session sess = HibernateHelper.currentTransaction();
Serializable result = sess.save(mh);
sess.flush(); //初始化SummaryClob字段
oracle.sql.CLOB clob = oracle.sql.CLOB.empty_lob();
mh.setSummaryClob(clob); /*也可采用此方法进行初始化
mh.setSummaryClob (Hibernate.createClob(""));
*/ //此处一定要用lockMode.UPGRADE模式进行锁定刷新
sess.refresh(mh, LockMode.UPGRADE); //获取MeetingHead实体的SummaryClobString属性值
String content = mh.getSummaryClobString(); //将获取的辅助字段的值通过oracle.sql.CLOB的putString()方法赋 值给实体内的summaryClob字段
oracle.sql.CLOB clob = (oracle.sql.CLOB) mh.getSummaryClob();
clob.putString(1, content);
…………
HbernateHelper.endCurrentTransaction();
return result;
http://www.hibernate.org/56.html
tx = session.beginTransaction();
//执行事务
newPhoto tempP=new newPhoto();
//先建立空的栏位
tempP.setImage(Hibernate.createBlob(new byte[1]));
System.out.println("开始保存空newPhoto");
session.save(tempP);
System.out.println("保存空newPhoto完毕");
// 执行flush,让Hibernate INSERT 空栏位
session.flush();
System.out.println("flush()完毕");
// 执行refresh,让Hibernate执行SELECT FOR UPDATE
session.refresh(tempP, LockMode.UPGRADE);
//当你锁定记录后 就通过这个对象获得他的 Blob; //xxx是你那个Blob 的字段
oracle.sql.BlOB clob = (oracle.sql.BlOB ) tempP.getXXX();
//然后获得流. //后面是什么我也记不太清楚. 你点出来看一下就是那个返回writer对象的就是了。
java.io.Writer pw = blob.getXXXXXXXXXXXX();
pw.writer(你的字节数组);
pw.close();
//提交事物就可以了.不要再次save()了
tx.commit();
flag=true;
}
它定义为非空,因此我在保存空的tempP时,只设定了image属性,未设定title属性,所以存不进去。改成如下这样就可以了:
Session session= HibernateSessionFactory.getSession();
Transaction tx=null;
Boolean flag=false;
try {
tx = session.beginTransaction();
//执行事务
newPhoto tempP=new newPhoto();
//先建立空的栏位
tempP.setTitle("a");
tempP.setImage(Hibernate.createBlob(new byte[1]));
System.out.println("开始保存空newPhoto");
session.save(tempP);
System.out.println("保存空newPhoto完毕");
// 执行flush,让Hibernate INSERT 空栏位
session.flush();
System.out.println("flush()完毕");
// 执行refresh,让Hibernate执行SELECT FOR UPDATE
session.refresh(tempP, LockMode.UPGRADE);
System.out.println("refresh()完毕");
tempP=p;
session.save(tempP);
tx.commit();
flag=true;
} 只是奇怪的是,在后台没有输出错误信息。后来我把异常打印出来了:
catch (Exception e) {
//如果出现异常,就撤销事务
e.printStackTrace();
if (tx!=null) tx.rollback();
throw e;
}
这才发现问题。不过无论如何也要谢谢楼上各位的热心!