DataTable PrimeFaces

Criei um datatable usando o primefaces, porem nao consigo fazer com que ao gerar um link de uma coluna chame outra pagina.

minha view:

<p:dataTable var="linha" value="#{transacaoLinhas.campos}" paginator="true" emptyMessage="Nenhum registro encontrado"
		loadingMessage="Buscando..." rows="10" selectionMode="single" style="width: 80%">
    	 <f:facet name="filtro">  
             <p:outputPanel>  
                 <h:outputText value="Localizar todos:" />  
                 <h:inputText id="globalFilter" />  
             </p:outputPanel>  
         </f:facet>  
         <p:column filterBy="#{linha.codigo}"   
                 headerText="Código" footerText="contains"  
                 filterMatchMode="contains">  
             <h:outputText id="codigo" value="#{linha.codigo}" />  
         </p:column>
         
         <p:column filterBy="#{linha.descricao}"   
                 headerText="Descrição" footerText="contains"  
                 filterMatchMode="contains">  
             <h:outputText id="descricao" value="#{linha.descricao}" />  
         </p:column>
         
         <p:column    
                 headerText="Alterar" footerText="contains"  
                 filterMatchMode="contains">  
             <h:commandLink id="alterar" actionListener="#{transacaoLinhas.alterarItem(linha.codigo)}" value="Alterar" />  
         </p:column>
         
         <p:column    
                 headerText="Excluir" footerText="contains"  
                 filterMatchMode="contains">  
             <h:commandLink id="excluir" actionListener="#{transacaoLinhas.excluirItem}" value="Excluir" />  
         </p:column>
    </p:dataTable>

meu codigo para alterar, onde deveria chamar a pagina.

public String alterarItem(Integer codigo) throws SQLException, ClassNotFoundException {
		Constantes.TRANSACAOATIVA = Constantes.TRANSACAOATIVA_EDIT;
                campo = codigo;
		return "TelaLinha";
	}

no caso a minha pagina seria a “TelaLinha”, onde quando usava um HtmlDataTable normal, conseguia fazer chamar essa pagina sem problemas. Existe alguma outra forma de fazer essa chamada?

Em vez de usar a propriedade actionListener, tente usar o action

Mesma coisa, executa mas nao chama a tela, alguma outra sugestao?

na view:

<p:dataTable value="#{transacaoLinhas.campos}" var="linha" ...>
  ...
  <p:column headerText="Ações">
    ...
    <!-- <h:link>s não executão actions, apenas navegam de uma view para outra. -->
    <h:link value="Editar" outcome="TelaLinha">
      <f:param name="id" value="#{linha.id}" />
    </h:link>
  </p:column>
</p:dataTable>

View TelaLinha.xhtml

<html ...>
<ui:composition template="...">
<ui:define name="...">
  <!-- Essa seção <h:metadata> serve apenas para pegar o parametro "id" que foi passado pela view anterior e coloca-lo na propriedade "id" do ManagedBean -->
  <f:metadata>
    <f:viewParam name="id" value="#{beanEditor.id}" />
  </f:metadata>

  <h:form>
    <!-- Esse <h:inputHidden> vai permitir que o seu ManagedBean lembre-se do id do objeto que sera editado -->
    <h:inputHidden value="#{beanEditor.id}" />
    ...
    <h:commandButton value="Salvar" action="#{beanEditor.updateLivro}" />
  </h:form>
</ui:define>
</h:composition>
</html>

BeanEditor.java:

@ManagedBean
@RequestScoped
public class BeanEditor {

  private Livro livro; // Esse é o objeto (entidade) que ser editado.

  public Long getId() { return livro.getId(); }
  public void setId(Long id) {
    if (livro == null) {
      // aqui vc carrega a sua entidade do banco.
    }
  }

  public String updateLivro() {
    // Aqui vc salva a entidade no banco.
  }

}