Back-End

15 fev, 2011

Usando JNDI com Hibernate

Publicidade

Olá, pessoal.

Neste artigo, vamos ver como usar JNDI dentro do seu arquivo
hibernate.cfg.xml e dentro de um ambiente de teste. Em um outro artigo,
falarei como usar em um ambiente de produção, para realizar mudanças nas conexões de modo mais fácil, uma
vez que normalmente o ambiente de teste possui configurações
levemente diferente do ambiente de produção desde nome do usuário
até o path do BD.

Nosso
Cenário

No meu blog já escrevi sobre
pool de conexão no TomCat e JNDI
, porém não falei como usar o
JNDI dentro do Hibernate. Aqui veremos isso com um
framework bem utilizado no mercado que é o Hibernate. Mas a pergunta que você
pode fazer é: “Camilo, por que eu usaria isso?” ou “Qual
a diferença na prática?”

Como sempre gostei de ser
mais prático e menos teórico, também tive essa dúvida. Porém,
descobri a grande produtividade quando tive 6 projetos diferentes para
produção, e sempre quando tínhamos um release, era normal esquecer
de mudar o hibernate.cfg.xml, para as conexões de produção, e ainda tinha que configurar
sempre no ambiente de desenvolvimento antes de enviar para produção.

Enfim, você
só vai configurar em um lugar as configurações de conexão, em um
único arquivo e mais nada. E o melhor, quando for para
PRODUÇÃO, veremos que lá temos outro arquivo JNDI só para PROD,
que normalmente não tem porque mudar com frequência. Precisamos apenas saber o JNDI correto, e o
administrador do Servidor vai se virar com as configurações do arquivo
de conexão em produção. Isso é extremamente importante!

Nosso
projeto

Criei um projeto muito
simples, pois a funcionalidade está no uso de JNDI com Hibernate em
teste. Não passa de um projeto com JSF + Hibernate. Porém, você
pode configurar isso em qualquer projeto com Hibernate para que ele
funcione com JNDI.

01. Primeiro
passo:

Configurar o arquivo
web.xml do seu projeto com o nome do JNDI que você preferir.

<resource-ref>
<res-ref-name>jdbc/lpjava</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

02. Segundo
passo:

Após ter configurado o
web.xml, informando que a conexão para o BD estará naquele path, vamos configurar o nosso JNDI, com os dados de conexão. Em ambiente
de teste, vamos configurar o arquivo context.xml que está na
pasta Server do Eclipse. É
nele que vão estar as configurações locais. Insira dentro da tag Context
o Resource abaixo:

<Resource auth="Container"
name="jdbc/lpjava"
driverClassName="com.mysql.jdbc.Driver"
maxActive="20" maxIdle="10" maxWait="-1"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost/apptestes"
password="si2005"
username="camilolopes"
validationQuery="SELECT 1"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="10000"
minEvictableIdleTimeMillis="60000" />

Observe: informamos o nome do JNDI, que este tem referência.

03. Terceiro passo:

Feito
isso, vamos informar ao Hibernate que ele vai usar uma conexão JNDI,
para o Hibernate o que importa é o path. Se amanhã você mudar a
senha de conexão, vai precisar alterar apenas o arquivo context.xml
que está na pasta Server dentro
do Eclipse, lembrando que isso é em ambiente de teste. Abaixo, veja como
ficou meu arquivo hibernate.cfg.xml:

<hibernate-configuration>
<session-factory name="hibernate/SessionFactory">
<property name="hibernate.connection.datasource">java:/comp/env/jdbc/lpjava</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.jdbc.batch_size">0</property>
<mapping class="br.com.camilolopes.bean.TUsuario"/>
</session-factory>
</hibernate-configuration>

Quem usa o Hibernate ou
está começando vai ver que não temos mais a property
para o password ou user,
uma vez que há uma referência para um path,
e ele tem referência para um arquivo (context.xml)
onde está de fato nossa conexão.

Finalizando

Teste
sua aplicação, mande executar e faça uma persistência. Porém, não
deixe de verificar se já deu um start
no banco de dados, se todos os .jars referente ao Hibernate estão
no projeto, e, no caso do Eclipse, olhe se está fisicamente na pasta
lib do projeto.

Vou
ficando por aqui. Se tiverem dúvidas, basta deixar um comentário.

Até a próxima!