Como Recuperar o que acabei de gravar?

17 respostas
V

Existe algum comando em JPA que eu possa recuperar o que acabei de gravar???

Eu tenho uma tabela onde o numero ID é gerado automaticamente, então eu não sei qual número vai ser gerado, eu preciso recuperar esse ID gerado para fazer outra tarefa… Porém, se eu mandar pegar o último registro gravado pode não ser a opção mais inteligente, pois mais pessoas utilizarão o programa, vai que 2 pessoas estão gravando ao mesmo tempo, posso recuperar o da outra pessoa, existe uma forma direta???

Obrigado desde já pessoal.

17 Respostas

J

Quando um atributo é gerado automaticamente, ele é atribuito ao objeto logo após ser persistido, então você pode simplesmente fazer isso:

Cliente cliente = new Cliente();
cliente.setNome("Jair");
cliente.setCidade("Belo Horizonte");

entityManager.persist(cliente);

long id = cliente.getId();
V

Está correto disso dei o comando mas não recuperou deu NullPointerException

Cpu cpu = new Cpu();
        
        cpu.setIsAlugado(true);
        cpu.setIdentificacao("10499");
        cpu.setLocalC("Sede Rio");
        cpu.setAndar("10º");
        cpu.setProcessador("Pentium III");
        entityManager.persist(cpu);
        
        long id = cpu.getId();
        
        System.out.println("ID é: " + id);

deu a mensagem de erro

Exception in thread "main" java.lang.NullPointerException
        at controle.AreaDeTeste.main(AreaDeTeste.java:49)

E no banco gravou as informações normalmente, era para retornar 1 que foi o ID gerado, mas deu o erro acima

J

Mas deu NullPointerException em que linha?

V

Nessa

long id = cpu.getId();
J

Você viu se a variavel cpu está nula? Não faz muito sentido esse erro nessa linha, coloca antes dela algo assim:

V

mas não teria motivo estar nula se acima eu atribuir várias informações

fiz até um teste coloquei isso no final

System.out.println("Processador: " + cpu.getProcessador());
      
        long id = cpu.getId();
        System.out.println("ID é: " + id);

e retornou o código certo do processador, que eu havia atribuído mais acima

J

Então tambem não faz sentido que dê NullPointerException ao chamar cpu.getId(), a não ser que esse getId() retorne um Long e não long, ou que tenha algum codigo que possa dar NullPointerException dentro dele…

Posta o codigo do getId().

J

Ahh, tente dar um flush() tambem, antes de chamar o getId().

entityManager.persist(cpu); entityManager.flush();

V

Realmente não retorna um Long, mas um Integer, desculpe, mas mesmo asism o problema persiste no caso de não retornar nada… não dá mais exceção, ele retorna null, fiz direto

System.out.println("ID é: " + cpu.getId());

tem certeza que quando se faz o persist ele atualiza no objeto?? não tem q dá outro comando não??, um merge, ou um outro

J

Tente:

V

Desculpe tem no top link tb… fiz algo errado aqui deixa eu ajeitar

V

Quando dou o refresh dá erro na linha do refresh

javax.persistence.EntityNotFoundException: Entity no longer exists in the database: modelo.Cpu[id=null]. at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.refresh(EntityManagerImpl.java:393)

em.persist(cpu);
           
            em.refresh(cpu);
           System.out.println("ID é: " + cpu.getId());  
            em.getTransaction().commit();

coloquei também depois do commit para ver se era isso o erro mas nada

em.persist(cpu);
      
            em.getTransaction().commit();
     
            em.refresh(cpu);
           System.out.println("ID é: " + cpu.getId());
E

kra quando eu uso o Hibernate com MySQL ele popula o id dependendo da maneira q vc mapeou o hbm. Tipo se mapear o generator como assigned não vai popular automanticamete, mas se vc mapear com native ai sim ele popula automaticamente. Se ainda tiver duvidas posta ai novamente.

Esqueleto.

J

Para “assigned” realmente não atribui pois como o proprio nome diz, é um atributo “pré-atributo”, mas pra todas as outras opções teoricamente deveria atribuir automaticamente, o problema é saber como o toplink trata isso, no meu modo de ver isso que foi feito deveria funcionar, só não descobri o motivo de não estar funcionando ainda.

R

eu uso JPA toplink e consigo recuperar o registro fazendo da seguinte forma:

persisto no banco;

executo commit;

executo refresh.
ex.:

transaction.begin();

manager.persist( objeto );

transaction.commit();

manager.refresh( objeto );

após o refresh, meu objeto recebe o Id q foi gerado automaticamente no mysql

E

Kra eu nunca trabalhei com o TopLink mas no hibernate ele popula automaticamente o id nem precisa do refresh. no Hibernate funciona assim

session.beginTransaction();

session.save(cliente);

session.getTransaction().commit();

System.out.println("Id do cliente q acabei de salvar…: " + cliente.getId());

resultado no console

Id do cliente q acabei de salvar…: 6

Espero ter ajudado

A

Seu Id está “anotado” ou mapeado como AutoGenerated?
Você disse que está salvando normalmente, já verificou no banco de dados como estão os registros, especialmente os Ids?

Qual o tipo de dados está definido na tabela do banco, e qual tipo está representado na classe Java?
:joia:

Criado 11 de fevereiro de 2008
Ultima resposta 24 de fev. de 2009
Respostas 17
Participantes 5