Подтвердить что ты не робот

Java.sql.SQLException: операция не разрешена: тип потоков не может использоваться при пакетной обработке при вставке данных в тип данных Oracle clob

Я использую Hibernate Tools 3.2.1.GA с Spring версией 3.0.2. Я привязываю для вставки данных в поле базы данных Oracle (10g) типа clob следующим образом.

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

он работает нормально, но когда я пытаюсь вставить поток данных с помощью CKEditor, demo на моей странице JSP (CKEditor просто отображает элемент HTML <textarea></textarea>), который может включать форматированный текст, а также изображения, флеш-память и т.д., он выдает следующее исключение.

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.


UPDATE:

Одно из объектов, использующих тип 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 я использую следующий код для выполнения вставки типа clob в Oracle.

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 является просто a Map model, формальным параметром метода submit() в классе контроллера Spring, который вызывается при нажатии кнопки отправки на странице 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();
}

Попытался сделать так, как упоминалось здесь, но безрезультатно (у меня есть те же исключения, что указаны в этом вопросе).

4b9b3361

Ответ 1

Исключение, указанное в вопросе, связано с тем, что более старая версия драйверов Oracle, похоже, не работает с типом данных Oracle clob. Я использовал Oracle JDBC Driver version - 9.0.2.0.0. Я загрузил новую версию из здесь, которая является Oracle JDBC Driver version - 10.2.0.5.0, которая отлично работает для моего приложения во всех ситуациях.

Где-то в Интернете кто-то утверждал, что если данные, хранящиеся в CKEditor, преобразуются (закодированы) в base64 при вставке в тип данных Oracle clob, этот подход будет работать без обновления драйвера (средства с более ранняя версия драйверов Oracle) (что так же очевидно требует декодирования из base64 при извлечении данных из базы данных).

но я действительно не применял его на практике, так как новая версия загруженного мной драйвера отлично работает для меня. Итак, я не уверен в более позднем подходе, и я оставляю его читателям.