Como Recuperar o que acabei de gravar?

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.

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

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

entityManager.persist(cliente);

long id = cliente.getId();[/code]

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

Mas deu NullPointerException em que linha?

Nessa

long id = cpu.getId(); 

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

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

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().

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

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

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

Tente:

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

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());  

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.

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.

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

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

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: