这是ORACLE数据库的特殊地方,向ORACLE存储Blob类型的字段时,必须如此操作,先插入一条空,然后取出来再插入实际的内容。

解决方案 »

  1.   

     tempP.setImage(Hibernate.createBlob(new byte[1])); 
    之后要行锁定。   你再对照我给你的那个教程。不过那个教程是clob的相信和blob原理一样的 sess.refresh(mh, LockMode.UPGRADE);
      

  2.   

    完整例子见下
    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;
      

  3.   

    官方实例见这里:
    http://www.hibernate.org/56.html
      

  4.   

      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; 
              
         } 
      

  5.   

    谢谢楼上各位,问题已经解决。但不是按照楼上两位大哥的方法。其实我的代码没有错,而是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;
            }
    这才发现问题。不过无论如何也要谢谢楼上各位的热心!