0

사용자 배포자를 사용하여 저장 용량 확장 테이블을 성공적으로 채울 수있게되었습니다. 이제 사용자가 퍼블리시하면 내 레코드가 완벽하게 표시됩니다. 모든 페이지.Tridion 페이지를 게시 취소하는 동안 Hibernate를 사용하여 테이블을 업데이트하는 방법

는 지금은 게시 취소 부분을 처리하는, 그래서, 아래의 샘플 코드를 참조하십시오 사용자 정의 페이지 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", 그러나 수정하려는 레코드의 테이블에서 ID를 가져 오려고 할 때 테이블에서 ID를 가져올 수 없기 때문에 항상 ID가 0으로 표시됩니다.

내 DAO에서 업데이트해야 할 레코드의 ID를 가져 오려면 구현해야 할 것을 제안하십시오.

감사합니다.

답변

3

findByTCMURI과 같은 방법으로 DAO에서 페이지 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 필드에 "ADD"가 포함 된 레코드를 추가하고 사용자가 동일한 페이지를 게시하면 ACTION 필드에 "UPD"가 새 레코드로 추가됩니다 사용자가 동일한 페이지를 게시 취소하면 ACTION에 DEL로 새 레코드가 테이블에 새 레코드로 추가됩니다. 이제이 경우 동일한 tcmuri 및 게시 ID가있는 테이블에 여러 항목이 있습니다. 여기에 대한 제안은 –

+1

안녕하세요. 테이블에서 여러 항목이 필요한 경우 executeQuerySingleResult 대신 executeQueryListResult를 사용하고 메서드가 List 을 반환하는지 확인할 수 있습니다. 그런 다음 루프를 반복하고 비즈니스 로직을 실행할 수 있습니다. –