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();
}
Попытался сделать так, как упоминалось здесь, но безрезультатно (у меня есть те же исключения, что указаны в этом вопросе).
Ответы
Ответ 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 при извлечении данных из базы данных).
но я действительно не применял его на практике, так как новая версия загруженного мной драйвера отлично работает для меня. Итак, я не уверен в более позднем подходе, и я оставляю его читателям.