Usando Stored Procedure para Insert com Hibernate

Olá garotada,

bom, me deparei com um “pobrema” intrigante e achei bom postar para ajudar vocês para não ficar patinando que nem eu (ou então postar um comentário dizendo que eu estou errado! hauuha)

Tinha uma solução que usava hibernate com JPA no modo clássico, ou seja, objeto relacional com os inserts e selects feitos pelo hibernate.

Porem depois descobrimos que o requisito era que todos os inserts e selects fossem feitos via stored procedure.

Para manter o hibernate e o JPA, pesquisei como executar stored procedure com hibernate. Em todos os lugares, indica-se o uso de @NamedNativeQuery.

Porem, precisava executar uma procedure para insert. Ela não é uma query, não retorna nada e o namedquery não trata uma query sem retorno. Logo, você é obrigado a retornar um cursor caso use o named query.

Outra opção para fazer o insert é o uso da opção:

@SQLInsert ( callable = true, sql = "call proc (?,?,?,?,?)" )

porem essa abordagem tem dois limitantes. Essa anotação não é suportada pelo JPA, e estamos usando o hibernate via JPA. Outro problema é que o hibernate ira automaticamente suprir as entradas em uma ordem especifica, então na própria documentação eles sugerem que você habilite os logs para ver em que ordem o hibernate faz o bind das entradas. Não obstante, caso a procedure tenha mais entradas que a sua classe Entity, irá dar erro.

A solução que estamos usando para fazer esse insert é essa:

entityManager = entityFactory.createEntityManager()
org.hibernate.Session session = (Session) entityManager.getDelegate();
EntityTransaction transaction = entityManager.getTransaction();
CallableStatement statement = session.connection().prepareCall("{ call proc(?,?) }");
statement.setString(1, "funciona procedure malandrinha!!!");
statement.setTimestamp(2, new Timestamp(new Date().getTime()));
statement.execute();

Infelizmente, tivemos que quebrar a interface do JPA, mas foi mais simples do que alterar todo o código para remover o JPA e utilizar o hibernate direto.

Espero que isso ajude alguém 😉

[ ]s

4 Comentários

Arquivado em Desenvolvimento, Hibernate, Java, JPA

4 Respostas para “Usando Stored Procedure para Insert com Hibernate

  1. Olá,

    E como fazem para fazer uma consulta? Uma vez que uma function retorne uma lista de registros, vc pegará esta lista e adicionará manualmente a uma coleção de dados para trafecar até a camada view?

  2. Cassio

    Estou tentado executar uma procedure passando parametros,
    ele somente realizara uma carga em uma tabela,
    eu estava seguindo o seu exemplo mais observei que o metodo connection() da session esta depreciado e que ele recomenda usar o doWork(Work ob), mais nao sei como utilizar

    • Opa Cassio, tudo bem?

      Temo não poder te ajudar. Também nao sei como utilizar essa interface nova, doWork. O hibernate que usamos é uma versão bem antiga.

      Se você conseguir resolver e quiser complementar o post, eu coloco depois sua contribuição com os devidos créditos ^.^ Assim podemos ajudar outras pessoas 😉

      Boa sorte!

Deixe um comentário