11

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

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

它工作得很好但是当我尝试使用CKEditor插入数据流时, 我的 JSP 页面上的演示<textarea></textarea>(CKEditor 只是呈现一个 HTML元素)可能涉及格式化文本以及图像、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驱动程序问题还是其他问题?我正在使用ojdbc14.jar, Oracle 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 控制器类中,我使用以下代码对ClobOracle 中的类型执行插入操作。

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

wheremodel是Spring 控制器类中方法Map model的一个形式参数,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();
}

尝试按照此处提到的方法进行操作,但无济于事(我面临与该问题中指定的相同异常)。

4

1 回答 1

18

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

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

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

于 2012-10-28T03:51:43.913 回答