Opa,
vou dar um exemplo de como faço com RichFaces (não sei se no seu caso você está usando JSF, mas vamos lá)
Suponha uma tabela (vou colocar somente as informações relevantes no exemplo):
<rich:dataTable width="100%" id="tabela_cidades" var="cidade" value="#{nome_backbean.lista_cidades}" >
<f:facet name="header">
...
</f:facet>
...
<rich:column align="center">
<h:selectBooleanCheckbox value="#{cidade.marked}" id="check>
<a4j:support action="#{nome_backbean.check}" event="onclick">
<f:param value="#{cidade.idCidade}" name="idCidade"/>
</a4j:support>
</h:selectBooleanCheckbox>
</rich:column>
...
<rich:dataTable>
Agora deixe-me explicar o que faço aí…
O valor da table é uma lista de cidades, presentes no backbean:
value="#{nome_backbean.lista_cidades}
dessa forma, a variável cidade refere-se a cada elemento da lista:
var="cidade"
O valor do selectBooleanCheckbox é uma propriedade booleana de cidade (que pode ser transient, por exemplo, usada só para essa finalidade). Nesse caso, especificamente, o nome da propriedade booleana é marked:
value="#{cidade.marked}"
Com o suporte a ajax do a4j, eu chamo um método no backbean que apenas retorna null. Essa chamada serve apenas para que o valor da propriedade booleana seja mudado no objeto da lista que foi selecionado, caso contrário o evento fica restrito no lado cliente (só ocorre na página) e o valor não é alterado.
<a4j:support action="#{nome_backbean.check}" event="onclick">
Dessa maneira, a cada vez que você marcar ou desmarcar um item, a propriedade booleana do item relacionado é alterado.
No final, quando você clicar em um botão, solicitando a inclusão desses itens no banco (ou o que quer que você precise fazer com eles) basta percorrer a lista usada para preencher a tabela, procurando pelos itens com a propriedade “true”.
Espero que te ajude!
[]'s