Hibernate + Mysql com Stored Procedure => Como pegar o Id inserido?

8 respostas
yumelee

Seguinte, como recupero um id inserido pela Stored Procedure (MySql) ?

Stored Procedure:
DELIMITER $$   
  
DROP PROCEDURE IF EXISTS `cuser` $$   
CREATE DEFINER=`root`@`localhost` PROCEDURE `cuser`(   
IN p_USNOME VARCHAR(50),   
INOUT ID INT(10)   
  
  
)   
BEGIN   
INSERT INTO tb_usuario   
(   
USNOME   
)   
VALUES   
(   
p_USNOME   
  
);   
SELECT last_insert_id() INTO ID;   
END $$   
  
DELIMITER ;

====================
A tabela tb_usuario é auto-increment !
Funciona certinho !
Só não sei como buscar esse ID pelo código Java

Entity    
@Table(name="tb_usuario", schema="test")   
@org.hibernate.annotations.SQLInsert(sql = "call cuser ( ?, ?)", callable = true)   
  
public class Usuario {   
  
@Column(updatable = true, name = "usnome", nullable = true, length = 50)   
private String usNome;   
  
@Id    
public int id;   
  
getters and setters....

ps: Nao posso definir nenhum @GeneratedValue porque nao sei o id q será inserido. Se eu colocar qq coisa, no meu getId() depois vai ter essa ‘qualquer coisa’. E quero o ID inserido na tabela pela Stored procedure !

Eu tenho não sei o id, ele vai ser criado (incrementado) na tabela, e quero conseguir busca-lo.<<

Alguém sabe ?

ps2: Nao me perguntem pquê SProced - normas da empresa.

8 Respostas

tfc1304

Eu estou com o mesmo problema…

G

Após chamar a procedure, se você fizer algo como abaixo imprime o id?

[...]
Usuario u = new Usuario();
u.setNome("Blah");

entityManager.merge(u);

System.out.println(u.getId());
yumelee

Bom, pra eu enviar o usuario, ele pede para eu inicializar o id, aih coloco qq coisa.
vai pra Stored Procedure, que nao insere esse id (corretamente), eh autoincrement, a tabela, e NAO ME DEVOLVE O ID INSERIDO.
Qdo faço um get.Id() aparece o id de início (usado para inicializar) e não o inserido na tabela (pelo autoincrement).

Entendeu ?

Este eh meu problema !!!

yumelee

zzzzzzzzzzzzzzzzzzzz

G

yumelee:
Bom, pra eu enviar o usuario, ele pede para eu inicializar o id, aih coloco qq coisa.
vai pra Stored Procedure, que nao insere esse id (corretamente), eh autoincrement, a tabela, e NAO ME DEVOLVE O ID INSERIDO.
Qdo faço um get.Id() aparece o id de início (usado para inicializar) e não o inserido na tabela (pelo autoincrement).

Entendeu ?

Este eh meu problema !!!

Se você não colocar @GeneratedValue no campo ID ele nunca vai te obrigar a ter esse valor. Há algo errado no teu código se ele pedir isso. Obvio que o hibernate vai trazer o valor que você setou na mão, pois assim ele está pegando do 1st level cache. Tente revisar seu código e passar o valor null como ID. E depois faça o teste que te sugeri.

Assim podemos sanar melhor as tuas dúvidas.

Abraços

yumelee

Olá, obrigada por responder !
Já coloquei: @Id @GeneratedValue(strategy=GenerationType.AUTO)
Já tirei !
Já coloquei a Stored Procedure recebendo um id com qualquer coisa -tipo INOUT- para que eu possa trabalhar com ela, mas nada funciona !
Nao consigo pegar o id inserido.

Eu vou reformular a pergunta, porque assim pode ajudar a quem souber de algo neste forum e quiser ajudar:

ALGUÉM JÁ USOU HINERNATE+ANNOTATIONS COM MYSQL E STORED PROCEDURE PARA FAZER INSERT ???

Alguém ?

Lavieri

eu ja fiz no SQLServer a abordagem é a mesma .... porem, como no meu caso como quem fazia o ID era eu mesmo, em uma tabela auxiliar não enfrentei tanta dificuldade... any way... try it!

tente anotar a coluna @Id com a anotação @org.hibernate.annotations.Generated(GeneretedTime.INSERT)

ficaria assim:

@Entity      
@Table(name="tb_usuario", schema="test")     
@org.hibernate.annotations.SQLInsert(sql = "call cuser ( ?, ?)", callable = true)
public class Usuario {     
   @Column(updatable = true, name = "usnome", nullable = true, length = 50)     
   private String usNome;     
    
   @Id      
   @org.hibernate.annotations.Generated(GenerationTime.INSERT)
   public Integer id;  //prefira Integer sobre int... afinal o valor de id é nulo enquanto não é persistido.
}

se não der certo, depois do insert, tente isso

id = session.getIdentifier(entity);

Tente não usar procedures, se é necessário mesmo, por questões de amarração de outros desenvolvedores, paciencia, mas se é uma amarração sua, remova a procedure e traga ela pra dentro do código java, onde vc pode domina-la melhor...

andresmafra

Poderiam me ajudar em como mapear uma procedure via annotations???
Não estou conseguindo…

é urgente!!

Abçs

Criado 8 de outubro de 2009
Ultima resposta 13 de nov. de 2009
Respostas 8
Participantes 5