Liferay setModifiedDate не влияет на дату модификации базы данных

Мне нужно создать журнальную статью с датой изменения 21/12/2012 в сервисе Java. Вот addArticle:

 * @param  serviceContext the service context to be applied. Can set the
 *         [...], modification date, [...]
 *         for the web content article.

Вот моя попытка:

Date date = new SimpleDateFormat("dd/MM/yyyy").parse("21/12/2012");
serviceContext.setModifiedDate(date);

// Add article.
JournalArticleLocalServiceUtil.addArticle(
    userId, groupId, folderId, titleMap, descriptionMap,
    xmlContent, structureKey, templateKey, serviceContext);

ПРОБЛЕМА: В базе данных созданная строка JournalArticle modifiedDate является сегодняшней датой.

Что я сделал не так?
Возможно, addArticle считается последним модификация? Как обойти это?


person Nicolas Raoul    schedule 20.06.2017    source источник
comment
Поскольку это довольно подробный вопрос, вы можете посмотреть реализацию по адресу github.com/liferay/com-liferay-journal/blob/master/ (выберите тег своей версии)   -  person Olaf Kock    schedule 20.06.2017


Ответы (2)


Вы можете добиться этого с помощью следующего кода:

JournalArticle journalArticle =
     JournalArticleUtil.create(CounterLocalServiceUtil.increment());
Date now = new Date();
Date modifiedDate = new SimpleDateFormat("dd/MM/yyyy").parse("21/12/2012");

journalArticle.setUserId(userId);
journalArticle.setGroupId(groupId);
journalArticle.setFolderId(folderId);
journalArticle.setTitleMap(titleMap);
journalArticle.setDescriptionMap(descriptionMap);
journalArticle.setContent(xmlContent);
journalArticle.setStructureId(structureKey);
journalArticle.setTemplateId(templateKey);
journalArticle.setCreateDate(now);
journalArticle.setModifiedDate(modifiedDate);

JournalArticle updatedJournalArticle = JournalArticleUtil.update(journalArticle);

Понимание:
1. JournalArticleUtil.create вернет вам новый объект класса JournalArticle.
2. Установите свойства (с фокусом: setModifiedDate) в соответствии с вашими требованиями.
3. Вызовите JournalArticleUtil.update, передав этот заполненный объект, чтобы сохранить его в базе данных.

person Parkash Kumar    schedule 23.06.2017

Попробуй это:

Date date = new SimpleDateFormat("dd/MM/yyyy").parse("21/12/2012");

// Add article.
JournalArticle article = JournalArticleLocalServiceUtil.addArticle(
    userId, groupId, folderId, titleMap, descriptionMap,
    xmlContent, structureKey, templateKey, serviceContext);

article.setModifiedDate(date);

JournalArticleLocalServiceUtil.updateJournalArticle(article);

Другой путь:

Вы можете использовать метод JournalArticleLocalServiceUtil.addJournalArticle(journalArticle), но вам придется вручную создать объект journalArticle:

long primaryKey = CounterLocalServiceUtil.increment(JournalArticle.class.getName());
JournalArticle journalArticle = JournalArticleLocalServiceUtil.createJournalArticle(primaryKey);

//Set all the journal properties you need...
journalArticle.setGroupId(yourGroupId);
journalArticle.setUserId(yourUserId);
journalArticle.setStructureId(ddmStructureKey);
journalArticle.setTemplateId(ddmTemplateKey);
...

JournalArticleLocalServiceUtil.addJournalArticle(journalArticle);

Это связано с API Liferay 7, но должно работать и на 6.2.

person Marco Mercuri    schedule 20.06.2017
comment
По соображениям производительности (миграция тонн контента) я бы предпочел второй вызов Liferay/базы данных. Но если нет другого решения, я воспользуюсь этим, спасибо! - person Nicolas Raoul; 21.06.2017
comment
Я отредактировал ответ, проверьте, лучше ли он для вас сейчас. Кстати, есть еще два обращения к БД :( - person Marco Mercuri; 21.06.2017
comment
Небольшое примечание: во втором листинге кода можно также добавить вызов setModifiedDate? Это тривиально, но в конце концов это суть вопроса, поэтому лучше сделать это на 100% ясным ^_^ - person Nicolas Raoul; 22.06.2017
comment
Кроме того, в чем разница между двумя предложенными вами способами: addArticle+updateJournalArticle и createJournalArticle+addJournalArticle? - person Nicolas Raoul; 22.06.2017
comment
Да, вы можете установить модифицированную дату, это один из ваших методов. Кстати, разница в том, что при втором способе вам нужно настроить все поля журнала, а их много: JournalArticle JavaDoc . Таким образом, вы должны проверить каждое поле, если оно требуется, если это идентификатор ecc ... В первом случае вместо этого Liferay сделает всю грязную работу. - person Marco Mercuri; 22.06.2017
comment
При addArticle+updateJournalArticle (первый способ) дата модификации устанавливается на сегодняшнюю дату, а не на указанную дату. createJournalArticle+addJournalArticle (с дюжиной setXXX) не создает ни одной новой строки в таблице базы данных JournalArticle, как ни странно. - person Nicolas Raoul; 22.06.2017
comment
Хороший ответ, но это JournalArticleUtil вместо JournalArticleLocalServiceUtil. - person Parkash Kumar; 23.06.2017