Как получить идентификатор первичного ключа из таблицы с помощью Hibernate для обновления таблицы при отмене публикации страницы Tridion

Я успешно смог заполнить таблицу расширения моего хранилища с помощью моего пользовательского развертывателя, теперь я вижу, что мои записи идут отлично, если пользователь публикует какую-либо страницу.

Теперь я хочу обработать часть Unpublishing, поэтому я написал undeployer пользовательской страницы, см. пример кода ниже:

@SuppressWarnings({ "rawtypes" })
public void process(TransportPackage data) throws ProcessingException 
{
    ProcessorInstructions instructions = data.getProcessorInstructions();       

    try 
    {
        for (Iterator iterator = instructions.getArguments(); iterator.hasNext(); ) 
        {
            Object argument = iterator.next();
            if (argument instanceof PageKey) 
            {
              PageKey pageKey = (PageKey)argument;
              TCDURI pageMetaURI = new TCDURI(pageKey.getId().getPublicationId(), 1168231104576L, pageKey.getId().getItemId());
              PageMeta pageMeta = this.pageMetaHome.findByPrimaryKey(pageMetaURI.getPublicationId(), 
                (int)pageMetaURI.getItemId());
              if (pageMeta == null)
              {
                  DeploymentHandler.undeploy(pageMetaURI);
              }
              else
              {
                  PublishAction publishAction = new PublishAction();
                  publishAction.setAction("DEL");
                  long id = publishAction.getId();
                  PublishActionDAO publishActionDAO = (PublishActionDAO) StorageManagerFactory.getDefaultDAO("PublishAction");
                  publishAction = publishActionDAO.findByPrimaryKey(id);
                  if (publishAction == null) 
                  {
                      log.debug("FindByPrimaryKey: cannot retrieve object with primary key:" + id);
                  }
                  else
                  {
                      publishAction = publishActionDAO.update(publishAction);
                      log.debug("SearchPageUndeployer Updated bean -" + publishAction);                      
                  }
              }
            }
        }
    }
    catch (Exception e) 
    {
        throw new ProcessingException("SearchPageUndeployer: Could not undeploy page", e);
    }
    super.process(data);
}

В приведенном выше коде вы можете видеть, что я пытаюсь обновить свое новое расширение хранилища «PublishAction», однако, когда я пытаюсь получить идентификатор из таблицы, для которой я хочу изменить запись, я всегда получаю идентификатор как 0, поскольку я не удалось получить идентификатор из таблицы.

Пожалуйста, предложите, что нужно реализовать в моем DAO, чтобы получить идентификатор из таблицы для записи, которую необходимо обновить.

Спасибо.




Ответы (1)


Вы можете создать в своем DAO метод, например findByTCMURI, для поиска вашего действия публикации на основе tcm uri страницы. Код будет примерно таким:

public PublishAction findByTCMURI(String tcmURI) throws StorageException {
    StringBuilder queryBuilder = new StringBuilder();
    queryBuilder.append("from PublishAction pa where pa.tcmuri = :tcmuri");

    Map<String, Object> queryParams = new HashMap<String, Object>();
    queryParams.put("tcmuri", tcmURI);

    return executeQuerySingleResult(queryBuilder.toString(), queryParams);
}

Должен сделать трюк. Надеюсь это поможет.

person Daniel Neagu    schedule 09.01.2013
comment
Привет Даниил, спасибо за ответ!! используя приведенный выше запрос, мы можем получить несколько записей, так как в моем случае, если пользователь публикует новую страницу, он добавит запись в таблицу с ДОБАВИТЬ в поле ДЕЙСТВИЕ, и снова пользователь опубликует ту же страницу, он добавит UPD в поле ДЕЙСТВИЕ как новую запись, и если пользователь не -публикация той же страницы будет добавлена ​​в новую запись с DEL в ДЕЙСТВИИ как новая запись в таблице. Теперь в этом случае у меня будет несколько записей в таблице с одинаковым tcmuri и идентификатором публикации, любые предложения по этому поводу - person Manoj Singh; 10.01.2013
comment
Всем привет. Если вам нужно несколько записей из таблицы, вы можете просто использовать executeQueryListResult вместо executeQuerySingleResult и убедиться, что ваш метод возвращает List‹PublishAction›. Затем вы можете просто просмотреть их и выполнить свою бизнес-логику. - person Daniel Neagu; 10.01.2013