Probelma com exemplo da Java Magazine 33 - hibernate

Pessoal, estou com problemas de configuração, do exemplo que saiu na javamagazine 33 de hibernate.Configurei tudo igual está sendo citado no exemplo , porém na hora de excutar tenho a seguinte exceção
java.lang.NoClassDefFoundError: org/hibernate/StaleObjectStateException

apresentacao.ControladorMapas.exibeMapaDiario(ControladorMapas.java:122) apresentacao.ControladorMapas.doGet(ControladorMapas.java:46) javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Li no artigo q isso é pq o objeto está obsoleto no sistema, porém ainda nem inicializei a aplicação, entao investiguei mais afundo, e olhei o log do hibernate q tem na aplicação e obrive a seguinte resposta

Agora já não sei mais o que fazer, configurei o web.xml e o context.xml além do hibernate.cfg.xml, mas nada até agora se alguém puder me ajudar
valeu

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>mapas</servlet-name>
        <servlet-class>apresentacao.ControladorMapas</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>mapas</servlet-name>
        <url-pattern>/mapa/*</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>reservas</servlet-name>
        <servlet-class>apresentacao.ControladorReservas</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>reservas</servlet-name>
        <url-pattern>/reserva/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
	<welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

context.xml

<?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:\hsqldb\data\reservas;shutdown=true"/>
               
  </Context>

hibernate.cfg.xml

<?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:\hsqldb\data\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>

Alguém tentou rodar este exemplo e conseguiu sem nenhum erro?

Cara também estou tentando rodar o exemplo. Dá o seguinte erro:

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

persistencia.PersistenciaException: Não foi possível listar as Reservas do dia Wed May 24 00:00:00 GMT 2006 persistencia.ReservaDAO.listaReservasDia(ReservaDAO.java:150)
apresentacao.ControladorMapas.exibeMapaDiario(ControladorMapas.java:123)
apresentacao.ControladorMapas.doGet(ControladorMapas.java:46)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.15 logs.

Meus arquivos:

context.xml:

<?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”>
–>

&lt;!-- Se permitir mais conexões, vou precisar de um meio de fazer
     o shutdown do HSQLDB.
     Poderia usar o ContextListenerr --&gt;
&lt;!--
&lt;parameter&gt;
  &lt;name&gt;maxActive&lt;/name&gt;
  &lt;value&gt;1&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
  &lt;name&gt;maxIdle&lt;/name&gt;
  &lt;value&gt;0&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
  &lt;name&gt;maxWait&lt;/name&gt;
  &lt;value&gt;-1&lt;/value&gt;
&lt;/parameter&gt;

&lt;parameter&gt;
 &lt;name&gt;username&lt;/name&gt;
 &lt;value&gt;sa&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
 &lt;name&gt;password&lt;/name&gt;
 &lt;value&gt;&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
   &lt;name&gt;driverClassName&lt;/name&gt;
   &lt;value&gt;org.hsqldb.jdbcDriver&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
  &lt;name&gt;url&lt;/name&gt;
  &lt;value&gt;jdbc:hsqldb:file:/home/lozano/jm/reservas;shutdown=true&lt;/value&gt;
&lt;/parameter&gt;
--&gt;

<!–
</ResourceParams>
–>

</Context>

web.xml:

<?xml version=“1.0” encoding=“UTF-8”?>
<web-app version=“2.4” xmlns=“http://java.sun.com/xml/ns/j2ee” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>
<servlet>
<servlet-name>mapas</servlet-name>
<servlet-class>apresentacao.ControladorMapas</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mapas</servlet-name>
<url-pattern>/mapa/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>reservas</servlet-name>
<servlet-class>apresentacao.ControladorReservas</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reservas</servlet-name>
<url-pattern>/reserva/
</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>

</web-app>

Estou tentendo usar o Pool de Conexão do Tomcat? Seria o caso de ele não estar conseguindo isso?

Depurei e vi que a mesagem volta da Classe ReservaDAO.

Esse trecho:
Session ses = TransacaoAplicacao.getSessao();
volta null.
Algúém sabe me dizer o porquê?

ReservaDAO.java:

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 &gt;= :inicio and r.inicio &lt;= :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 &gt;= :inicio and r.inicio &lt;= :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);
    }
}

}