O que tá errado no código JPA?

4 respostas
V

Ele roda mas não deleta, já coloquei o flush e tb nada... aparenta q tá tudo ok!, o nome passado existe no banco, não tem espaços em brancos a mais, não é chave primária, tentei passar pela chave, mas nem pela chave remove tb.

public void removerRegistro(String nome) 
	 {
		 factory = Persistence.createEntityManagerFactory("exfuncionarios");
		 manager = factory.createEntityManager();
			System.out.print("Excluindo registro... ");
			EntityTransaction tx = manager.getTransaction();
			tx.begin();
			try
			{
				Cadastro cadastro = new Cadastro();
				cadastro.setNome(nome);
				Cadastro cad = merge(cadastro);
				
				manager.remove(cad);

				tx.commit();
			//	manager.flush();
				System.out.println("OK");
				manager.close();
				factory.close();
			}
			catch (RuntimeException e) 
			{
				e.printStackTrace();
				tx.rollback();
			}
		}

4 Respostas

C

O que você ta querendo fazer nessas linhas?

Cadastro cadastro = new Cadastro();
 cadastro.setNome(nome);
 Cadastro cad = merge(cadastro);

Você tá querendo atualizar e depois excluir?

Você tem é que buscar usando find ou refresh.

Dessa maneira não vai funcionar.

V

To querendo remover… mas para eu remover não teria que acha o objeto primeiro??? passando o nome???

como ficaria o exemplo então??? quero remover… só tenho o nome do cara… não é chave primária, preciso fazer um find e buscar o objeto q no caso é o cadastro??? se sim, como faço isso.

V

Melhor, o código abaixo creio q seria o mais correto

public void removerRegistro(Cadastro cadastro) 
	 {
		 factory = Persistence.createEntityManagerFactory("exfuncionarios");
		 manager = factory.createEntityManager();
			System.out.print("Excluindo registro... ");
			EntityTransaction tx = manager.getTransaction();
			tx.begin();
			try
			{
				
				manager.remove(cadastro);

				tx.commit();
			
				System.out.println("OK");
				manager.close();
				factory.close();
			}
			catch (RuntimeException e)
			{
				e.printStackTrace();
				tx.rollback();
			}
		}

Mas para eu mandar um objeto cadastro, teria que buscar ele já q teria somente o nome que não é uma chave. creio q o código abaixo não é o mais correto.... é do modelo do de cima só que para busca, além disso dá erro

cadastroDAO.removerRegistro(cadastroDAO.recuperaRegistro("Vitor Hugo"));
C

O método find do entityManager só poder ser utilizado se você tiver uma pk.

Acho que utilizando o refresh dá certo.

Assim:

public void removerRegistro(Cadastro cadastro)
    {
       factory = Persistence.createEntityManagerFactory("exfuncionarios");
       manager = factory.createEntityManager();
         System.out.print("Excluindo registro... ");
         EntityTransaction tx = manager.getTransaction();
         tx.begin();
         try
         {
            
            manager.refresh(cadastro); //Atualiza o objeto com os dados do banco, se tiver dois nomes iguais ou mais, ele pegará o primeiro.

            manager.remove(cadastro);

            tx.commit();
         
            System.out.println("OK");
            manager.close();
            factory.close();
         }
         catch (RuntimeException e)
         {
            e.printStackTrace();
            tx.rollback();
         }
      }
Criado 9 de fevereiro de 2007
Ultima resposta 9 de fev. de 2007
Respostas 4
Participantes 2