0

liferay ポートレット プロジェクトで blob データを挿入および更新する必要があります。開発には liferay-6.1.2-ce-ga3 を使用しています。私のservice.xmlには次のblobフィールドがあります

 <column name="applicationData" type="Blob" db-name="application_data" />

サービスのビルド後、サービス ビルダーで生成されたクラスを使用して BLOB データを正常に挿入しました。

   myEntity.setApplicationData(blobdata);  
   myEntityLocalServiceUtil.addMyEntity(myEntity);

次のようにブロブデータを更新しようとしました

  myEntity.setCachedModel(false);    
  myEntity.setApplicationData(blobdata);
  myEntityLocalServiceUtil.updateMyEntity(myEntity,false);

しかし、ブロブ データ以外はすべて更新されています。BatchSessionImplソースを確認したところ、通常はsession.merge(model)をスキップして blob 更新を行う update メソッドにsession.saveOrUpdate(model)呼び出しのようなメソッドがないことに気付きました。

以下は BatchSessionImpl クラスの update メソッドです

public void update(Session session, BaseModel<?> model, boolean merge)
    throws ORMException {

    if (merge || model.isCachedModel()) {
        session.merge(model);
    }
    else {
        if (model.isNew()) {
            session.save(model);

            model.setNew(false);
        }
        else {
            session.merge(model);
        }
    }

    if (!isEnabled()) {
        session.flush();

        return;
    }

    if ((PropsValues.HIBERNATE_JDBC_BATCH_SIZE == 0) ||
        ((_counter.get() % PropsValues.HIBERNATE_JDBC_BATCH_SIZE) == 0)) {

        session.flush();
    }

    _counter.set(_counter.get() + 1);
}

私の場合、else ケースのsession.merge(model)が呼び出されています。blob データを更新できるように、jboss にバンドルされている liferay-6.1.2-ce-ga3 に固有のものはありますか? 誰かが私にいくつかの回避策を提案できますか?

4

1 に答える 1

0

ext プラグインを作成することで問題を解決しました。update メソッドの BatchSessionImpl クラスの ext-impl を次のように変更しました。

public void update(Session session, BaseModel<?> model, boolean merge)
    throws ORMException {

    if (merge || model.isCachedModel()) {
        session.merge(model);
    }
    else {
        if (model.isNew()) {
            session.save(model);

            model.setNew(false);
        }
        else {
            session.saveOrUpdate(model);
        }
    }

    if (!isEnabled()) {
        session.flush();

        return;
    }

    if ((PropsValues.HIBERNATE_JDBC_BATCH_SIZE == 0) ||
        ((_counter.get() % PropsValues.HIBERNATE_JDBC_BATCH_SIZE) == 0)) {

        session.flush();
    }

    _counter.set(_counter.get() + 1);
}
于 2015-01-16T07:05:10.353 に答える