Update JPA

Boa tarde galera, estou tendo dificuldade de implementar o metodo update com jpa. ao fazer o update outro regstro é inserido, sei que devo pesquisar o ‘id’ antes para que efetue o update , mas a duvida é como chamar. abaixo o codigo:

no controler:

 public void alterarCliente(ActionEvent actionEvent){
        ClienteDAO dao = new ClienteDAO();
        dao.update(cliente);
        }

no DAO

public Cliente getCliente(long id) {
        EntityManager em = getEntityManager();
        return (Cliente) em.find(Cliente.class, id);
        }


public void update(Cliente cliente){
            
        EntityManager em = getEntityManager();
        
        try{
            //inicia o processo de transacao
                    em.getTransaction().begin();
                    em.merge(cliente);
                    //manda bala para o BD
                    em.getTransaction().commit();
                    }catch(Exception e) {
                    //se der algo de errado vem parar aqui, onde eh cancelado
                    em.getTransaction().rollback();
                    //cancela a transcao em caso de falha
                    
		}

obrigado e boa tarde a todos.

O objeto cliente possui um id válido e compatível com algum registro já existente no banco de dados?

sim existe, a classe esta mapeada:

@Table(name="cliente")//caso o nome da tabela seja diferente informe aqui
public class Cliente implements Serializable {
        @Column(name="nome")
        private String nome;

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        //anotação acima indica que o campo será gerado automaticamente pelo BD
        @Column(name="id")

Não foi isso que perguntei.
O fato de ter um id mapeado não implica, necessariamente, que o mesmo esteja com algum valor e, menos ainda, que este valor corresponda a algum registro no banco de dados.

desculpe a ignorancia, nesse caso voce se refere ao fato do parametro estar sendo passado do xhtml para o controller? pode ser mais claro, pois estou partindo de php orientado para jsf e apanho um bocado…obrigado.

Pois é, por isso eu sempre recomendo estudar o(s) framework(s) que você vai utilizar.
Bom, a idéia é a seguinte, você só consegue atualizar um registro no banco de dados, se você disser qual é este registro.
A forma mais comum é passar, na cláusula WHERE, a PK do registro.
No teu caso, creio que a PK seja representada pelo id do objeto Cliente. Se este atributo (id) estiver nulo, o método merge, do EntityManager, não irá atualizar nada, apenas inserir um novo registro.
Ficou claro agora?

desculpe a demora…ficou sim consegui. e estou estudando o framework! valeu