Probelma com exemplo da Java Magazine 33 - hibernate

2 respostas
V

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>

2 Respostas

V

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

P

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=“<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> xmlns:xsi=“<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a> xsi:schemaLocation=“<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>”>

<servlet>

<servlet-name>mapas</servlet-name>

<servlet-class>apresentacao.ControladorMapas</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>mapas</servlet-name>

<url-pattern>/mapa/<em></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/</em></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><a href="http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt</a></taglib-uri>

<taglib-location>/WEB-INF/fmt.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/fmt-rt">http://java.sun.com/jsp/jstl/fmt-rt</a></taglib-uri>

<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a></taglib-uri>

<taglib-location>/WEB-INF/c.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/core-rt">http://java.sun.com/jsp/jstl/core-rt</a></taglib-uri>

<taglib-location>/WEB-INF/c-rt.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/sql">http://java.sun.com/jsp/jstl/sql</a></taglib-uri>

<taglib-location>/WEB-INF/sql.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/sql-rt">http://java.sun.com/jsp/jstl/sql-rt</a></taglib-uri>

<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/x">http://java.sun.com/jsp/jstl/x</a></taglib-uri>

<taglib-location>/WEB-INF/x.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri><a href="http://java.sun.com/jsp/jstl/x-rt">http://java.sun.com/jsp/jstl/x-rt</a></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.<em>;

import org.hibernate.</em>;

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);
    }
}

}

Criado 5 de maio de 2006
Ultima resposta 24 de mai. de 2006
Respostas 2
Participantes 2