Liferay Service Builder не обновляет BLOB
Я пытаюсь заставить мою службу Liferay Service обновить столбец типа BLOB. Сохранение соответствующей сущности работает нормально, как и удаление. Обновление не вызывает исключение, а просто возвращает старое значение в поле типа BLOB.
Моя настройка:
- Liferay 6.1 CE GA3 в комплекте с Tomcat
- Liferay Plugins SDK для 6.1 GA3
- 5.6.19 MySQL Community Server
- hibernate3.jar (из https://issues.liferay.com/browse/LPS-42478)
Мои шаги в Eclipse:
создать новый проект портлета Liferay
создать новый Liferay Service Builder (пакет com.test, пространство имен my_service)
-edit service.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.1.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_1_0.dtd">
<service-builder package-path="com.test">
<author>fe</author>
<namespace>my_service</namespace>
<entity name="Foo" local-service="true" remote-service="true" cache-enabled="false">
<column name="fooId" type="long" primary="true" />
<column name="companyId" type="long" />
<column name="userId" type="long" />
<column name="userName" type="String" />
<column name="createDate" type="Date" />
<column name="modifiedDate" type="Date" />
<column name="field1" type="Blob" />
<order by="asc">
<order-column name="fooId" />
</order>
</entity>
</service-builder>
-ант-сервис
-edit FooLocalServiceImpl.java:
public Foo addFoo(User user, String data, ServiceContext serviceContext) throws PortalException, SystemException {
Date now = new Date();
long fooId = counterLocalService.increment(Foo.class.getName());
Foo foo = fooPersistence.create(fooId);
foo.setCompanyId(user.getCompanyId());
foo.setUserId(user.getUserId());
foo.setCreateDate(serviceContext.getCreateDate(now));
foo.setModifiedDate(serviceContext.getModifiedDate(now));
Blob blob = null;
try {
blob = new SerialBlob(data.getBytes());
} catch (Exception e) {
e.printStackTrace();
return null;
}
foo.setField1(blob);
super.addFoo(foo);
return foo;
}
public Foo updateFoo(User user, long fooId, String data, ServiceContext serviceContext) throws PortalException, SystemException {
Date now = new Date();
Foo foo = FooLocalServiceUtil.fetchFoo(fooId);
foo.setCachedModel(false);
foo.setModifiedDate(serviceContext.getModifiedDate(now));
Blob blob = null;
try {
blob = new SerialBlob(data.getBytes());
} catch (Exception e) {
e.printStackTrace();
return null;
}
foo.setField1(blob);
super.updateFoo(foo);
return foo;
}
-ант-сервис
-Удалить дублирующую запись из portlet-hbm.xml
-edit view.jsp:
<%
User user = PortalUtil.getUser(request);
ServiceContext serviceContext = ServiceContextFactory.getInstance(request);
Foo foo = FooLocalServiceUtil.addFoo(user, "This is some data", serviceContext);
long fooId = foo.getFooId();
%>
We added a Foo (<%=foo.getModifiedDate().getTime() %>)<br>
<%
Blob blob = FooLocalServiceUtil.fetchFoo(fooId).getField1();
byte[] bdata = blob.getBytes(1, (int) blob.length());
String data = new String(bdata);
%>
It contains the data "<%=data%>"<br>
<%
foo = FooLocalServiceUtil.updateFoo(user, fooId, "This is some updated data", serviceContext);
fooId = foo.getFooId();
%>
Now we updated the Foo (<%=foo.getModifiedDate().getTime() %>)<br>
<%
blob = FooLocalServiceUtil.fetchFoo(fooId).getField1();
bdata = blob.getBytes(1, (int) blob.length());
data = new String(bdata);
%>
It contains the data "<%=data%>"<br>
установить свойства портала:
hibernate.jdbc.batch_size=0
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
hibernate.cache.use_query_cache=false
hibernate.cache.use_second_level_cache=false
-Портлет портлета через Eclipse
К сожалению, столбец BLOB, похоже, не получает обновления, в то время как ModifiedDate его получает.
Когда я проверяю БД, я получаю:
mysql> select * from my_service_Foo;
+-------+-----------+--------+----------+---------------------+---------------------+-------------------+
| fooId | companyId | userId | userName | createDate | modifiedDate | field1 |
+-------+-----------+--------+----------+---------------------+---------------------+-------------------+
| 1 | 10153 | 10406 | | 2014-06-24 07:06:37 | 2014-06-24 07:06:37 | This is some data |
+-------+-----------+--------+----------+---------------------+---------------------+-------------------+
1 ответ
У меня тоже была та же проблема. Я внес несколько изменений в вызов метода update.
Вот изменение, которое вы можете сделать в вашем методе updateFoo
super.updateFoo (Foo, ложь);
Второй аргумент в вашем вызове метода установит для логического слияния значение false, которое принудительно выполнит оператор session.saveOrUpdate и пропустит оператор session.merge(foo) в методе upadate() метода BatchSessionImpl.