Amigos estou tentando rodar o exemplo da Java Magazine 33 sobre Hibernate na web. Acredito que consegui montar tudo correto. Mas na hora que o Tomcat Inicia ele acessa a aplicação mas sai em uma excessão que diz: Não foi possÃvel listar as Reservas do dia …(dia de hoje no caso).
Depurei e vi que a mesagem volta da Classe ReservaDAO.
Esse trecho:
Session ses = TransacaoAplicacao.getSessao();
volta null.
O exemplo usa o pool de conexões do tomcat. Acho que não estou sabendo configurar corretamente o pool de conexões para acessar o hsqldb.
Alguém pode me ajudar? Preciso de uma orientação sobre como configurar adequadamente hibernate + pool de conexão do Tomcat + hsqldb.
Segue meus arquivos:
ReservaDAO.java:
[code]package persistencia;
import java.text.DateFormat;
import java.util.;
import org.hibernate.;
import org.hibernate.exception.*;
public class ReservaDAO {
//TODO: este DAO sempre inicia e finaliza suas próprias transações, portanto não pode ser usada como parte de uma transação maior
//TODO: deveria haver um objeto de negócios (ou fachada) para fazer este controle
public ReservaDAO() {
}
public Sala leSala(int id) {
try {
Session ses = TransacaoAplicacao.getSessao();
Sala sala = (Sala) ses.get(Sala.class, new Integer(id));
TransacaoAplicacao.confirma();
return sala;
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel recuperar a Sala " + id, e);
}
}
public List listaSalas() {
try {
Session ses = TransacaoAplicacao.getSessao();
Query query = ses.createQuery("from Sala s order by s.nome");
List resultado = query.list();
TransacaoAplicacao.confirma();
return resultado;
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel listar as Salas", e);
}
}
public void salvaReserva(Reserva r) {
try {
Session ses = TransacaoAplicacao.getSessao();
ses.saveOrUpdate(r);
//TODO: Tirar todos os confirmas e deixar que alguém (o controlador?) faça isto???
TransacaoAplicacao.confirma();
}
catch (ConstraintViolationException e) {
TransacaoAplicacao.aborta();
DateFormat df = DateFormat.getInstance();
throw new InsercaoDuplicadaException("Outro usuário já fez uma reserva para a sala " +
r.getSala().getNome() + " no dia " + df.format(r.getInicio()), e);
}
catch (StaleObjectStateException e) {
TransacaoAplicacao.aborta();
throw new LockOtimistaException("A Reserva " + r.getId() + " já foi alterada por outro usuário", e);
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel salvar a Reserva: " + r.getId(), e);
}
}
public void cancelaReserva(Reserva r) {
try {
Session ses = TransacaoAplicacao.getSessao();
ses.delete(r);
TransacaoAplicacao.confirma();
}
catch (StaleObjectStateException e) {
TransacaoAplicacao.aborta();
throw new LockOtimistaException("A Reserva " + r.getId() + " já foi alterada por outro usuário", e);
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel salvar a Reserva: " + r.getId(), e);
}
}
public Reserva leReserva(int id) {
try {
Session ses = TransacaoAplicacao.getSessao();
Query query = ses.createQuery(
"from Reserva r join fetch r.sala s " +
"where r.id = :id ");
query.setParameter("id", new Integer(id));
List resultado = query.list();
TransacaoAplicacao.confirma();
if (resultado.size() == 1)
return (Reserva)resultado.get(0);
else
return null;
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel recuperar a Reserva " + id, e);
}
}
public List listaReservasSala(int sala, Calendar inicio, Calendar fim) {
return listaReservasSala(sala, inicio.getTime(), fim.getTime());
}
public List listaReservasSala(int sala, Date inicio, Date fim) {
try {
Session ses = TransacaoAplicacao.getSessao();
Query query = ses.createQuery(
"from Reserva r join fetch r.sala s " +
"where s.id = :sala " +
"and r.inicio >= :inicio and r.inicio <= :fim " +
"order by hour(r.inicio), dayofweek(r.inicio)");
query.setParameter("sala", new Integer(sala));
query.setParameter("inicio", inicio);
query.setParameter("fim", fim);
List resultado = query.list();
TransacaoAplicacao.confirma();
return resultado;
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel listar as Reservas para a sala "
- sala + " no perÃodo indicado", e);
}
}
public List listaReservasDia(Date data) {
Calendar cal = Calendar.getInstance();
cal.setTime(data);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
data = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
try {
Session ses = TransacaoAplicacao.getSessao();
Query query = ses.createQuery(
"from Reserva r join fetch r.sala s " +
"where r.inicio >= :inicio and r.inicio <= :fim " +
"order by hour(r.inicio), s.nome ");
query.setParameter("inicio", data);
query.setParameter("fim", cal.getTime());
List resultado = query.list();
TransacaoAplicacao.confirma();
return resultado;
}
catch (Exception e) {
TransacaoAplicacao.aborta();
throw new PersistenciaException("Não foi possÃvel listar as Reservas do dia "
- data, e);
}
}
} [/code]
context.xml:
[code]<?xml version="1.0" encoding="UTF-8"?>
<Context path="/reservaSalas">
<!-- para o Tomcat 5.5 -->
<Resource name="jdbc/Reservas" auth="Container" type="javax.sql.DataSource"
maxActive="1" maxIdle="0" maxWait="-1"
username="sa" password="" driverClassName="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:file:C:\bd\Reservas;shutdown=true"/>
<!-- para o Tomcat 5.0 -->
<!–
<Resource name="jdbc/Reservas"
auth="Container"
type="javax.sql.DataSource" />
–>
<!–
<ResourceParams name="jdbc/Reservas">
–>
<!-- Se permitir mais conexões, vou precisar de um meio de fazer
o shutdown do HSQLDB.
Poderia usar o ContextListenerr -->
<!–
<parameter>
<name>maxActive</name>
<value>1</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>0</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.hsqldb.jdbcDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:hsqldb:file:/home/lozano/jm/reservas;shutdown=true</value>
</parameter>
–>
<!–
</ResourceParams>
–>
</Context>
[/code]
hibernate.cfg.xml
[code]<?xml version=‘1.0’ encoding=‘utf-8’?>
<!DOCTYPE hibernate-configuration PUBLIC
“-//Hibernate/Hibernate Configuration DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”>
<hibernate-configuration>
<session-factory>
<!-- Parâmetros de conexão ao banco de dados -->
<property name="connection.datasource">java:/comp/env/jdbc/Reservas</property>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:file:C:\bd\Reservas;shutdown=true</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<!-- Dialeto SQL do banco -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Exibe comandos SQL na saída padrão -->
<property name="show_sql">false</property>
<!-- Arquivos de mapeamento OO/Relacional -->
<mapping resource="persistencia/Sala.hbm.xml"/>
<mapping resource="persistencia/Reserva.hbm.xml"/>
</session-factory>
</hibernate-configuration>[/code]