Table JSF - Ajuda

tenho uma classe onde cria a minha table, e uma classe onde criei para alimentar dois botoes que vai ser adicionados nessa table
que eu crio primeiro colunas depois linhas e faço apos isso a concatenaçao, coluna x linhas…e no final de cada uma das linhas de registro é adicionado os botoes

Codigo Descricao Tipo Alterar Excluir
01 Maria F botao botao

ficaria mais ou menos assim

a tela está sendo criada, tranquilamente…

aqui vai os codigos:

@ManagedBean
@SessionScoped
public class CriaGrid {
	// Init
	// --------------------------------------------------------------------------------------

	private static List<List<String>> dynamicList; // Simulate fake DB.
	private static String[] dynamicHeaders; // Optional.
	private HtmlPanelGroup dynamicDataTableGroup; // Placeholder.
	private GridTelaPadrao tipoTelas = null;

	// Actions
	// -----------------------------------------------------------------------------------

	public CriaGrid() {
		super();
	}

	public CriaGrid(GridTelaPadrao obj) throws SQLException {
		super();
		tipoTelas = obj;
	}

	private void loadDynamicList() throws SQLException {
		Conexao consulta = new Conexao();
		consulta.Conecta();
		// Set headers (optional).
		String[] colunas = null;
		colunas = tipoTelas.Titulo();
		dynamicHeaders = colunas;

		// Set rows. This is a stub example, just do your dynamic thing.
		ArrayList<String> registros = null;
		registros = tipoTelas.Coluna();

		ResultSet rsGrid = consulta.Consulta(tipoTelas.Sql());
		dynamicList = new ArrayList<List<String>>();
		System.out.println(tipoTelas.Coluna().size());
		while (rsGrid.next()) {
			ArrayList<String> campos = new ArrayList<String>();
			for (int i = 0; i < tipoTelas.Coluna().size(); i++) {
				campos.add(rsGrid.getString(registros.get(i)));
			}

			campos.add(""); // botao alterar
			campos.add(""); // botao excluir
			dynamicList.add(campos);
		}
	}

	private void populateDynamicDataTable() {
		// Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">.
		HtmlDataTable dynamicDataTable = new HtmlDataTable();

		ValueExpression ve = FacesContext
				.getCurrentInstance()
				.getApplication()
				.getExpressionFactory()
				.createValueExpression(
						FacesContext.getCurrentInstance().getELContext(),
						"#{criaGrid.dynamicList}", List.class);

		dynamicDataTable.setValueExpression("value", ve);
		dynamicDataTable.setVar("dynamicItem");
		// Iterate over columns.
		for (int i = 0; i < dynamicList.get(0).size(); i++) {
			// Create <h:column>.
			HtmlColumn column = new HtmlColumn();
			dynamicDataTable.getChildren().add(column);

			// Create <h:outputText value="dynamicHeaders[i]"> for <f:facet
			// name="header"> of column.
			HtmlOutputText header = new HtmlOutputText();
			header.setValue(dynamicHeaders[i]);
			column.setHeader(header);

			// Create <h:outputText value="#{dynamicItem[" + i + "]}"> for the
			// body of column.
			HtmlOutputText output = new HtmlOutputText();
			ValueExpression ve2 = FacesContext
					.getCurrentInstance()
					.getApplication()
					.getExpressionFactory()
					.createValueExpression(
							FacesContext.getCurrentInstance().getELContext(),
							"#{dynamicItem[" + i + "]}", String.class);

			output.setValueExpression("value", ve2);
			column.getChildren().add(output);

                        // *******criaçao dos botoess************
			if (i + 2 == dynamicList.get(0).size()) {
				FacesContext fctx = FacesContext.getCurrentInstance();
				ELContext elctx = fctx.getELContext();
				Application app = fctx.getApplication();
				ExpressionFactory exprFactory = app.getExpressionFactory();
				HtmlCommandButton edit = (HtmlCommandButton) app
						.createComponent(HtmlCommandButton.COMPONENT_TYPE);
				edit.setId("edit");
				edit.setValueExpression("value", exprFactory
						.createValueExpression(elctx,
								"#{transacaoLinhas.gridEdit}", String.class));
				column.getChildren().add(edit);
			} else if (i + 1 == dynamicList.get(0).size()) {
				FacesContext fctx = FacesContext.getCurrentInstance();
				ELContext elctx = fctx.getELContext();
				Application app = fctx.getApplication();
				ExpressionFactory exprFactory = app.getExpressionFactory();
				HtmlCommandButton delete = (HtmlCommandButton) app
						.createComponent(HtmlCommandButton.COMPONENT_TYPE);
				delete.setId("delete");
				delete.setValueExpression("value", exprFactory
						.createValueExpression(elctx,
								"#{transacaoLinhas.gridDelete}", String.class));
				column.getChildren().add(delete);
			}
		}

		// Add the datatable to <h:panelGroup
		// binding="#{myBean.dynamicDataTableGroup}">.
		dynamicDataTableGroup = new HtmlPanelGroup();
		dynamicDataTableGroup.getChildren().add(dynamicDataTable);
	}

	// Getters
	// -----------------------------------------------------------------------------------

	public HtmlPanelGroup getDynamicDataTableGroup() throws SQLException {
		// This will be called once in the first RESTORE VIEW phase.
		if (tipoTelas != null) {
			if (dynamicDataTableGroup == null) {
				loadDynamicList(); // Preload dynamic list.
				populateDynamicDataTable(); // Populate editable datatable.
			}
		}
		return dynamicDataTableGroup;
	}

	public List<List<String>> getDynamicList() {
		return dynamicList;
	}

	// Setters
	// -----------------------------------------------------------------------------------
	public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
		this.dynamicDataTableGroup = dynamicDataTableGroup;
	}
}

aqui vai o managebean para os botoes

@ManagedBean
@RequestScoped
@SessionScoped
@ApplicationScoped
@ViewScoped
public class TransacaoLinhas {
	public String getGridEdit(){
		System.out.println("chegou aqui pela grid Editar");
		return "Alterar";
	}
	
	public String getGridDelete(){
		System.out.println("chegou aqui pela grid Delete");
		return "Excluir";
	}

}

O meu problema está na seguinte situaçao, toda vez que eu clico por exemplo no botao Alterar, ele executa o MB do altera e o MB tbm do excluir, e isso ele faz para toda a quantidade de registros que eu tenho, ou seja, se eu tiver 16 registros, e clicar no botao Alterar, vai executar 16 vezes os dois MBs (Alterar e Excluir)

Alguma ideia de onde está o erro?

Alguém já trabalhou com criaçao de table assim, dinamicamente?