0

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

Теперь я хочу, чтобы обрабатывать Отмену публикации части, так что я написал на заказ странице 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, чтобы получить идентификатор из таблицы для записи, которую необходимо обновить.

Спасибо.

ответ

3

Вы можете создать в своем 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); 
} 

Необходимо сделать трюк. Надеюсь, это поможет.

+0

Привет, Даниэль, спасибо, что ответ! используя вышеприведенный запрос, мы можем получить несколько записей, как в моем случае, если пользователь опубликовал новую страницу, он добавит запись в таблицу с «ДОБАВИТЬ» в поле ACTION, и снова пользователь опубликует ту же страницу, что добавит «UPD» в поле ACTION в качестве новой записи и если пользователь не публикует одну и ту же страницу, в новой записи добавится новая запись с «DEL» в ACTION в качестве новой записи в таблице. Теперь в этом случае у меня будет несколько записей в таблице с одним и тем же номером tcmuri и идентификатором публикации, любые предложения по этому вопросу –

+1

Привет. Если вам нужно несколько записей из таблицы, вы можете просто использовать executeQueryListResult вместо executeQuerySingleResult и убедиться, что ваш метод возвращает List . Затем вы можете просто пропустить их и выполнить свою бизнес-логику. –