Update utilizando JPA

Boa tarde,
Estou desenvolvendo um projeto web, no qual utilizo JPA, porém estou tendo dificuldade em dar update nos dados contidos em ArrayList, debugando, verifiquei que o registro foi encontrado no banco e que o comando merge está sendo chamado, mas é como se eu desse um persist, pois os dados são inseridos novamente.

O que eu estou fazendo de errado?

Obrigada.

public String importarProdutos() throws FileNotFoundException, ClassNotFoundException{
		Conversation.instance().begin(true, true);
		importacao.setData(new Date()); 
		byte[] arquivo =  importacao.getArquivo();
		produtoManager = new ProdutoManager();
		produtoManager.setProdutos(GerenciadorXML.importarProduto(arquivo));
		
		Query query1 = entityManager.createQuery("from Usuario u where u = ?1");
		query1.setParameter(1, usuarioLogado);
		List<Usuario> us = (List<Usuario>) query1.getResultList();
		importacao.setMantenedor(us.get(0)); 			
		entityManager.persist(importacao); 
		importacoes.add(importacao);
		entityManager.flush();
				
		for (int i = 0; i < produtoManager.getProdutos().size(); i++) {
			Query query = entityManager.createQuery("from Produto p where p.codigo = ?1");
			query.setParameter(1, produtoManager.getProdutos().get(i).getCodigo());
			List<Produto> produto = (List<Produto>)query.getResultList();
			
			if(produto.size()>0){
				entityManager.merge(produtoManager.getProdutos().get(i));
			}else{
				entityManager.clear();
				if(produtoManager.getProdutos().get(i)==null){
					produtoManager.getProdutos().get(i).setMantenedor(us.get(0));
				}
				entityManager.persist(produtoManager.getProdutos().get(i));
				entityManager.flush();	
			}
			
		}
		
		facesMessages.add("Importacao efetuada com sucesso.");
		Conversation.instance().end();
		return "irParaImportacaoList";
	}

O merge, na verdade, tem diversos propósitos. Um deles é atualizar. Outro deles é persistir o objeto se este está num estado de detached (pra mais informações, leia este link (é do Hibernate, mas acredito que funcione da mesma maneira para o JPA). Ele é bom também porque diz porquê você não precisa usar o flush em alguns casos).

Então, se o objeto estiver detached, o EntityManager vai persistir ele. Pra resolver isso, tenta fazer o seguinte. Supondo que ‘o’ é o objeto que quero alterar, faço assim:

o = em.merge.(o);
// mudo algumas coisas nele
em.merge(o);

No primeiro merge (que ocorre a atribuição), eu atualizo o estado do objeto ‘o’ para gerenciado (managed). Se eu não fizer isso, ele vai persistir porque o ‘o’ ainda é detached.
Acho que pode ser isso.