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 ページのデモ (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.jarOracle JDBC Driver version - 9.0.2.0.0ます。


アップデート:

Clobタイプを使用するエンティティの 1 つは

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は単に であり、 JSPページで送信ボタンがクリックされたときに呼び出される Spring コントローラ クラスMap modelのメソッドの正式なパラメータです。submit()


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、すべての状況で私のアプリケーションで問題なく動作します。

インターネットのどこかで、Oracle clob データ型に挿入する際に CKEditor が保持するデータを base64 に変換 (エンコード) すると、ドライバーを更新せずにアプローチが機能することが誰かによって述べられました (つまり、古いバージョンのOracle ドライバー) (これは、データベースからデータを取得する際に base64 からデコードする必要があることは明らかです)。

しかし、ダウンロードした新しいバージョンのドライバーがうまく機能しているので、実際には実行しませんでした。したがって、後のアプローチについてはよくわかりません。読者に任せています。

于 2012-10-28T03:51:43.913 に答える