Conectar JasperReport com DB via Hibernate

Olá Pessoal,

O objetivo deste post é mostrar como conectar com jasperReport com DB usando Hibernate, é comum ver a conexão via JDBC tradicional, mas nem sempre é isso que queremos.Então veremos agora com Hibernate.

Lets go…

Contexto

Talvez você já tenha passado por o problema abaixo:

Class.forName(“com.mysql.jdbc.Driver”);

String db = “jdbc:mysql://localhost:3306/relatorios”;

conn = DriverManager.getConnection(db,”camilo”,”lopes”);

E não será nada legal ter que colocar esses dados dentro do seu code Java, ou criar um arquivo separado só para isso, e quando o user/password/url, sofrerem alterações teremos que mudar em mais de um lugar? Duplicated Context is not good! :). Até um dia desses nunca precisei eu não tinha preocupação com a conexão uma vez que já passava para o JasperPrint uma lista(list) dos dados recuperados via HQL, conforme os posts a seguir:

JasperReport com JEE

JasperReport + Hibernate

Mas, nem sempre HQL,Criteria etc, atende a uma regra de negócio da melhor forma, no meu caso, já tinhamos o .SQL com as devidas queries e lá que estavam as regras com base no DB que estamos trabalhando, que vai além de um simples retrieve. Daí, será q eu deveria usar HQL/Criteria somente porque estou usando Hibernate? Neste caso, a resposta não. Tive que analisar o impacto, o custo disso e onde as mudanças aconteceriam, e após uma investigação baseado em testes, usar o .SQL será a melhor solução pelo seguintes pontos:

  • toda mudança de regra de negócio referente à DataWarehouse acontece de fato no banco, nos .SQL etc. Então não tem porque eu querer “repetir” as regras do .SQL dentro do código Java;
  • evitou a duplicação de código, porque se a regra vem da DW, o código Java só ia executar ela, então se .SQL muda, terei que mudar também o HQL, seria maior trabalho;
  • Ireport com .SQL eles tem um bom relacionamento;
  • Minha app Java fica mais especifica, com o objetivo apenas de gerar o report;

Desenvolvendo

Levando em conta que você já tem seu report pronto, vou mostrar apenas como configurar sua app para conectar do DB via Hibernate.

Step 1

Na class DAO

Adicione o método a seguir:

publicstatic Connection getConnection() throws HibernateException, SQLException{

returnnew AnnotationConfiguration().configure().buildSettings().getConnectionProvider()
.getConnection();

}

Agora na sua classe que gera o Report adicione:

Não esqueça de importar o arquivo .jrxml para o seu projeto no eclipse.

JasperReport pathRxml = JasperCompileManager.compileReport(“layout/reportcamilo.jrxml”);

JasperPrint printReport = JasperFillManager.fillReport(pathRxml, null, DAO.getConnection());

JasperExportManager.exportReportToPdfFile(printReport, “reportexcamilo.pdf”);

 

Pronto, era apenas isso, passar o objeto Connection vindo do Hibernate para o método fillReport(), se você viu os posts mais antigos, a diferença é que não tem mais a List, sendo passada no terceiro parametro.

Feito, isso, salve e rode Java Application.

Resultado:


Vou ficando por aqui, e espero que tenham gostado do post.

See ya!

Uma simples aplicação Hibernate + JSF + poolConexao

olá Pessoal,

Bem, hoje resolvi fazer um post, do qual eu já tive problemas e acredito que alguém já passou ou passa por isso. Vc nunca ficou perdido nos passos de como desenvolver uma nova aplicação usando um conjunto de frameworks? Tipo, por onde começar? Quando você faz isso com frequência não tem como esquecer, mas não é a realidade, nem todo dia estamos criando novas aplicações e alguns processos base, “dão branco”. Eu sofria com isso, quando precisava iniciar uma nova app do zero. Claro que hoje temos ferramentas que nos ajuda. Mas, vamos esquecer essas ferramentas de auxilio e pensar em um ambiente que não temos ela disponível.

O objetivo deste post, é documentar tópicos  para que você possa montar uma pequena estrutura para o ambiente de produção e ao mesmo tempo ir reelembrando aquilo que seu cerebro deixou no “pool” dele. Usarei o Hibernate + JSF tendo o pool de conexão implementado.

note: Claro em projetos reais e grandes não fazemos isso, para não perder tempo e tb não é nada legal. Porém, se você está começando agora a fazer aplicações sem muita experiência, procure sempre lembrar a funcionalidade de cada framework dentro do projeto e quando eles aparecem no desenvolvimento isto é tão importante qto saber usar cada um deles.

Lets go…

note: vou considerar os passos abaixo para um ambiente de produção, pois em testes raramente temos problemas. Um deles é o open session view que só descobrir ele quando subir minha app.

Steps

  1. Ter o BD e tabelas criadas

  2. criar a estrutura do projeto JSF Project

  3. Adicionar as bibliotecas dos frameworks

  4. criar o bean e fazer os annotations (não queira usar xml )

  5. criar o JNDI META-INF/context.xml

  6. criar o pool de conexao com o JNDI em web.xml (Resources)

  7. atualizar o hibernate.cfg.xml com o JNDI/Pool de conexão.

    current_session_context_class: thread

    connection.datasource: java:com/env/jdbc/nomejndi

    transaction.factory_class:org.hibernate.transaction.JDBCTransactionFactory

    jdbc.batch_size:0

  8. criar o DAO Generico com Hibernate no package dao

  9. Criar a classeDAO para fazer a persistencia no BD

  10. criar o managebean e controlador para JSF

  11. iniciar a construção do front end com JSF.

  12. Implementar o SpringSecurity (optional)

  13. Implementar o Filter para evitar o open session view

Claro que nesses passos há temos apenas  os pontos chaves que acabam reativando o conhecimento que está la no “pool de string” do seu cerebro.

Visite a nossa as categorias abaixo no blog que boa parte dos assuntos listados nos passos estão nas respectivas categorias:

https://blog.camilolopes.com.br/category/hibernate/

https://blog.camilolopes.com.br/category/java/

https://blog.camilolopes.com.br/category/javaee/

https://blog.camilolopes.com.br/category/jpa/

https://blog.camilolopes.com.br/category/jsf/

Abracos, see you next post. 🙂

Solucionando Communication link failure Hibernate com Pool + Mysql

olá Pessoal,

Hoje vou apresentar como resolver o problema abaixo quando temos nossa aplicação em produção e onde apostaríamos tudo que estava ok, pois em teste vc nunca tinha visto à exceção a seguir. Mas, pq em produção ela aparece e o cliente liga dizendo que está dando erro?

Bem, eu sofri muito com essa exceção, pesquisei bastante e vi várias dicas porém nenhuma delas eu conseguia resolver, dai conversando com Edson Gonçalves o mesmo me passou dois links importantes o qual encontrei a solução um está em inglês e outro é da Caelum explicando o outro problema que é broken pipe que é bem comum aparecer.

Lets go..

Posts Relacionado:

Mas, Por que temos essa exceção em PRODUÇÃO?

hibernateexcecaopool

A resposta é bem simples, se a conexão com seu banco ficar inativo por mais de 8 horas no caso do MySql, então o banco mata a conexão. E quando o cliente usando o pool de conexão tenta usar, já eh tarde demais.

Solucionando

Aqui estou usando o pool de conexão que é required em qualquer aplicação JEE, até por questão de manutenção, porém vou limitar o code apenas para meu arquivo context.xml.

Portanto abra seu arquivo META-INF/context.xml que faz o pool de conexão que você deve deixa-lo como o código a seguir:


  

 


Depois disso, manda o xml para produção, dar um restart no servidor e testa. Aqui resolveu. Até que fim.

o código anterior era assim:


  

 

Bem, espero que o post tenha ajudado, resolvi fazer esse post tendo como referencia o post em ingles, devido durante as minhas pesquisas não achei nada em português tão objetivo e direto para resolver o problema, só encontrava, discussões e opiniões de como poderia ser resolvido, mas nada de resolver. Agora já temos :). Mas, não se esqueça que isso tem efeitos apenas em produção.

abraços, see ya!!