java.sql.SQLException:不允许操作:在将数据插入Oracle clob数据类型时,不能在批处理中使用streams类型

时间:2012-08-22 14:23:25

标签: spring hibernate jsp oracle10g clob

我正在使用Hibernate Tools 3.2.1.GA和Spring 3.0.2版。我想将数据插入到clob类型的Oracle(10g)数据库字段中,如下所示。

Clob c=Hibernate.createClob(request.getParameter("someTextFieldValueOnJSPPage");
pojoObj.setSomeClobProperty(c);

它工作得很好,但当我尝试在我的JSP页面上使用CKEditordemo插入数据流时(CKEditor只是呈现HTML <textarea></textarea>元素)涉及格式化文本以及图像,flash等,它会引发以下异常。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not update: [model.Cms#1]

org.hibernate.exception.GenericJDBCException: could not update: [model.Cms#1]

java.sql.SQLException: operation not allowed: streams type cannot be used in batching

如何解决该异常?这是Oracle driver problem还是其他什么?我正在使用ojdbc14.jarOracle JDBC Driver version - 9.0.2.0.0


更新

使用Clob类型的实体之一是

public class Cms  implements java.io.Serializable
{
     private BigDecimal cmsId;
     private Clob aboutUs;     //I'm currently dealing with this property.
     private Clob contactUs;
     private Clob privacyPolicy;
     private Clob returnPolicy;
     private Clob shippingPolicy;
     private Clob termsOfUse;
     private Clob exchangeLinks;
     private Clob disclaimer;
     private Clob aboutProducts;
     private Clob purchasingConditions;
     private Clob faq;

    //Parameterized constructor(s) along with the default one as and when needed.

    //Getters and setters.
}

在我的Spring控制器类中,我使用以下代码在Oracle中的Clob类型上执行插入。

Cms c=new Cms();
c.setCmsId(new BigDecimal(0));
c.setAboutUs(Hibernate.createClob(request.getParameter("txtAboutUs")));
session.save(c);
session.flush();
session.getTransaction().commit();
model.put("status", "1");
model.put("msg","Insertion done successfully.");
//setParameter(cb);

其中model只是Map model,是Spring控制器类中submit()方法的形式参数,在JSP页面上单击提交按钮时会调用该参数。


我正在Spring控制器类

中使用以下简单方法检索数据
private void getData(Map model)
{
    Session session=NewHibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    List<Cms>list=session.createQuery("from Cms order by cmsId desc").list();
    model.put("list", list);

    session.flush();
    session.getTransaction().commit();
}

试图像上面提到的here那样做但无济于事(我面临与该问题中指定的相同的例外情况)。

1 个答案:

答案 0 :(得分:18)

问题中提到的抛出的异常是由于旧版本的Oracle驱动程序似乎无法与Oracle clob数据类型一起使用。我正在使用Oracle JDBC Driver version - 9.0.2.0.0。我从here下载了一个新版本Oracle JDBC Driver version - 10.2.0.5.0,在所有情况下都可以正常使用我的应用程序。

在互联网上的某个地方,有人说如果CKEditor持有的数据在插入Oracle clob数据类型时被转换(编码)为base64,那么该方法将在不更新驱动程序的情况下工作(具有旧版本的Oracle驱动程序)(显然需要在从数据库中检索数据时从base64解码)。

但我确实没有付诸实践,因为我下载的驱动程序的新版本对我来说很好。所以,我不确定后来的方法,我将它留给读者。