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
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: