Blob 数据更新在与 jboss 捆绑的 liferay-6.1.2-ce-ga3 中失败



我需要在Liferay Portlet项目中插入和更新blob数据。我正在使用liferay-6.1.2-ce-ga3进行开发。我的服务.xml具有以下 blob 字段

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

服务构建后,我已使用服务构建器生成的类成功插入 blob 数据。

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

我尝试按如下方式更新 blob 数据

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

但是,除了 blob 数据之外的所有内容都在更新。当我检查 BatchSessionImpl 源代码时,我注意到它的更新方法中没有像 session.saveOrUpdate(model) 调用这样的方法,该方法通常通过跳过 session.merge(model) 来执行 blob 更新。

下面是 BatchSessionImpl 类的更新方法

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

在我的案例中,session.merge(model) 在 else 的情况下被调用。Liferay-6.1.2-ce-ga3 与 jboss 捆绑在一起,以便我们可以更新 blob 数据,这有什么具体的事情吗?有人可以建议我一些解决方法吗?

我已经通过创建一个ext插件解决了这个问题。我在 ext-impl 中对 BatchSessionImpl 类的更新方法进行了更改,如下所示

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

最新更新