Problemas com Hibernate

15 respostas
P

Pessoal, tentei utilizar o hibernate, porém não obtive sucesso, fiz todas as configurações necessárias (tentei usar o artigo do Daniel Quirino) mas não sei pq nunca é retornado nada do banco de dados, para que vc´s possam me ajudar vou colocar abaixo as configurações que fiz e as mensagens retornadas pelo TOMCAT.

OBS: O que posso adiantar é que tenho um POOL configurado e rodando plenamente, pois tenho classes que usam este POOL.

Espero que vc´s deem uma LUZ!

- Saída no Tomcat

15/07/2004 22:42:09 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on port 8080
15/07/2004 22:42:09 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 4217 ms
15/07/2004 22:42:10 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
15/07/2004 22:42:10 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.0.19
15/07/2004 22:42:10 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
15/07/2004 22:42:12 org.apache.catalina.startup.ContextConfig validateSecurityRo
les
INFO: WARNING: Security role name aluno used in an <auth-constraint> without bei
ng defined in a <security-role>
15/07/2004 22:42:12 org.apache.catalina.startup.ContextConfig validateSecurityRo
les
INFO: WARNING: Security role name professor used in an <auth-constraint> without
 being defined in a <security-role>
15/07/2004 22:42:13 org.apache.catalina.core.StandardHost getDeployer
INFO: Create Host deployer for direct deployment ( non-jmx )
15/07/2004 22:42:13 org.apache.catalina.core.StandardHostDeployer install
INFO: Processing Context configuration file URL file:C:jakarta-tomcat-5.0.19co
nfCatalinalocalhostadmin.xml
15/07/2004 22:42:13 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=tru
e
15/07/2004 22:42:13 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.action.ActionResources', returnNul
l=true
15/07/2004 22:42:14 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.webapp.admin.ApplicationResources', retur
nNull=true
15/07/2004 22:42:18 org.apache.catalina.core.StandardHostDeployer install
INFO: Processing Context configuration file URL file:C:jakarta-tomcat-5.0.19co
nfCatalinalocalhostalancer.xml
15/07/2004 22:42:18 org.apache.catalina.core.StandardHostDeployer install
INFO: Processing Context configuration file URL file:C:jakarta-tomcat-5.0.19co
nfCatalinalocalhostmanager.xml
15/07/2004 22:42:18 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /jsp-examples from URL file:C:
jakarta-tomcat-5.0.19webappsjsp-examples
15/07/2004 22:42:19 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path  from URL file:C:jakarta-tomca
t-5.0.19webappsROOT
15/07/2004 22:42:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /servlets-examples from URL fil
e:C:jakarta-tomcat-5.0.19webappsservlets-examples
15/07/2004 22:42:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /tomcat-docs from URL file:C:j
akarta-tomcat-5.0.19webapps	omcat-docs
15/07/2004 22:42:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /webdav from URL file:C:jakart
a-tomcat-5.0.19webappswebdav
15/07/2004 22:42:21 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on port 8080
15/07/2004 22:42:21 org.apache.jk.common.ChannelSocket init
INFO: JK2: ajp13 listening on /0.0.0.0:8009
15/07/2004 22:42:21 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=10/60  config=C:jakarta-tomcat-5.0.19confjk2.prope
rties
15/07/2004 22:42:21 org.apache.catalina.startup.Catalina start
INFO: Server startup in 12137 ms
15/07/2004 22:42:46 net.sf.hibernate.cfg.Environment <clinit>
INFO: Hibernate 2.1.4
15/07/2004 22:42:46 net.sf.hibernate.cfg.Environment <clinit>
INFO: loaded properties from resource hibernate.properties: {hibernate.connectio
n.username=Administrador, hibernate.connection.password=, hibernate.cglib.use_re
flection_optimizer=true, hibernate.connection.url=jdbc:postgresql://localhost:54
32/base, hibernate.connection.driver_class=org.postgresql.Driver}
15/07/2004 22:42:46 net.sf.hibernate.cfg.Environment <clinit>
INFO: using CGLIB reflection optimizer
15/07/2004 22:42:46 net.sf.hibernate.cfg.Configuration addClass
INFO: Mapping resource: br/com/tutorialfmu/questionario/Materia.hbm.xml
15/07/2004 22:42:47 net.sf.hibernate.cfg.Binder bindRootClass
INFO: Mapping class: br.com.tutorialfmu.questionario.Materia -> materia
15/07/2004 22:42:47 net.sf.hibernate.cfg.Configuration secondPassCompile
INFO: processing one-to-many association mappings
15/07/2004 22:42:47 net.sf.hibernate.cfg.Configuration secondPassCompile
INFO: processing one-to-one association property references
15/07/2004 22:42:47 net.sf.hibernate.cfg.Configuration secondPassCompile
INFO: processing foreign key constraints
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
WARNING: No dialect set - using GenericDialect: The dialect was not set. Set the
 property hibernate.dialect.
15/07/2004 22:42:47 net.sf.hibernate.dialect.Dialect <init>
INFO: Using dialect: net.sf.hibernate.dialect.GenericDialect
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
INFO: Use outer join fetching: false
15/07/2004 22:42:47 net.sf.hibernate.connection.DriverManagerConnectionProvider
configure
INFO: Using Hibernate built-in connection pool (not for production use!)
15/07/2004 22:42:47 net.sf.hibernate.connection.DriverManagerConnectionProvider
configure
INFO: Hibernate connection pool size: 20
15/07/2004 22:42:47 net.sf.hibernate.connection.DriverManagerConnectionProvider
configure
INFO: using driver: org.postgresql.Driver at URL: jdbc:postgresql://localhost:54
32/base
15/07/2004 22:42:47 net.sf.hibernate.connection.DriverManagerConnectionProvider
configure
INFO: connection properties: {user=Administrador, password=}
15/07/2004 22:42:47 net.sf.hibernate.transaction.TransactionManagerLookupFactory
 getTransactionManagerLookup
INFO: No TransactionManagerLookup configured (in JTA environment, use of process
 level read-write cache is not recommended)
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
INFO: Use scrollable result sets: true
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
INFO: Use JDBC3 getGeneratedKeys(): false
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
INFO: Optimize cache for minimal puts: false
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
INFO: Query language substitutions: {}
15/07/2004 22:42:47 net.sf.hibernate.cfg.SettingsFactory buildSettings
INFO: cache provider: net.sf.ehcache.hibernate.Provider
15/07/2004 22:42:48 net.sf.hibernate.cfg.Configuration configureCaches
INFO: instantiating and configuring caches
15/07/2004 22:42:48 net.sf.hibernate.impl.SessionFactoryImpl <init>
INFO: building session factory

- DAO

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;

public class MateriaDAO {
    
    private SessionFactory factory;
    
    public MateriaDAO() throws Exception {
        Configuration cfg = new Configuration();
        cfg.addClass(Materia.class);
        factory = cfg.buildSessionFactory();
    }
    
    public java.util.List getMateria() throws Exception {
        Session session = factory.openSession();
        java.util.List materia = session.find("from br.com.tutorialfmu.questionario.Materia as materia where materia.id > 0");
        return materia;
    }

- BEAN

public class Materia {
    
    private int id;
    private String nome;
    
    public Materia() {
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public int getId() {
        return this.id;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public String getNome() {
        return this.nome;
    }

- Arquivo de mapeamento Este cara escrevi agora correndo pode ter algum erro mesmo.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping.dtd">

<hibernate-mapping>
    <class name="br.com.tutoruialfmu.questionario.Materia" table="materia">
        <id name="id" column="id" type="int">
            <generator class="assigned"/>
        </id>
        <property name="nome" type="string"/>
    </class>
</hibernate-mapping>

- Desta forma que faço uma consulta

try {
          List materias;
          MateriaDAO materia = new MateriaDAO();
          materias = materia.getMateria();
          session.setAttribute("materias", materias);
          }
          catch(Exception e){}
  • hibernate.properties (armazenado em WEB-INFclasses)
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.url=jdbc:postgresql://localhost:5432/base
hibernate.connection.username=Administrador
hibernate.connection.password=
  • hibernate.cfg.xml (WEB-INFclasses)
    Tentei substituir o hibernate.properties por este xml, pois tinha visto na documentação que esta é uma forma de configurarar porém foi até pior o erro, pois nem achar a conexão achava!
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
    
<hibernate-configuration>
	<session-factory>
		<property name="connection.datasource">java:comp/env/jdbc/postgre</property>
		<property name="show_sql">false</property>
		<property name="dialect">net.sf.hibernate.dialect.PostgreSQLDialect</property>
		
		<!-- Mapping files -->
		<mapping resourse="br/com/tutorialfmu/questionario/Pergunta.hbm.xml" />
		<mapping resourse="br/com/tutorialfmu/questionario/Materia.hbm.xml" />
	<session-factory>
</hibernate-configuration>

- Os .jar que deixei disponíveis no dir lib

15 Respostas

Umlauf

O que eu puder notar é que faltou definir o dialect no hibernate.properties:

hibernate.dialect=net.sf.hibernate.dialect.PostgreSQLDialect

O motivo pelo qual ele não acha a conexão usando o hibernate.cfg.xml é que, *acho*, talvez vc não tenha definido o datasource no server.xml do Tomcat.

Mas você pode usar os mesmo parâmetros usados no hibernate.properties:

<property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/base</property>
        <property name="connection.username">Administrador </property>
        <property name="connection.password"></property>
        <property name="show_sql">false</property>
        <property name="dialect">net.sf.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</property>
        
        <!-- Mapping files -->
        ....
P

Olá Umlauf!

Olha, fiz a alteração no meu hibernate.properties como vc disee, colocando o dialect.
Eu ainda continuo com problemas, porém ao contrário de antes eu sei onde esta o problema, vou colocar o erro e alguns trechos de código para ver se vc pode ajudar.

Erro retornado pelo tomcat:

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

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

exception 

javax.servlet.ServletException: Servlet execution threw an exception


root cause 

java.lang.NoClassDefFoundError: javax/transaction/Synchronization
	net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:312)
	net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:325)
	net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:333)
	br.com.tutorialfmu.questionario.MateriaDAO.getMateria(MateriaDAO.java:28)
	br.com.tutorialfmu.aluno.AlunoController.doGet(AlunoController.java:35)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)


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


--------------------------------------------------------------------------------

Apache Tomcat/5.0.19

Código de acesso ao DAO (através de um Servlet)
-Olha a linha comentada é exatamente onde acontece o erro que mostrei acima, ou seja, o erro não acontece na instância da classe, mas sim quando chamo o método.

try {
          List materias;
          MateriaDAO materia = new MateriaDAO();
          //**é aqui que acontece o erro ->materias = materia.getMateria();
          }
          catch(Exception e){
              e.printStackTrace();
          }

Aqui a classe DAO que faço a chamada acima

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;

public class MateriaDAO {
    
    private SessionFactory factory;
    
    public MateriaDAO() throws Exception {
        Configuration cfg = new Configuration();
        cfg.addClass(Materia.class);
        factory = cfg.buildSessionFactory();
    }
    
   //**** Este método que esta dando erro*****
    public java.util.List getMateria() throws Exception {
        Session session = factory.openSession();
        java.util.List materia = session.find("from br.com.tutorialfmu.questionario.Materia");
        return materia;
    } 
}
_fs

Está faltando algum jar no classpath da sua aplicação ou do tomcat.

Java.lang.NoClassDefFoundError: javax/transaction/Synchronization
P

Oh Lipe!

Tem algum .jar que seja necessário ser colocado obrigatóriamente no CLASSPATH???

Pergunto isso pq todos os .JAR do hibernate eu coloquei todos em WEB-INFlib.

Eles são: (tomei como base o que vi no site: http://www.hibernate.org/hib_docs/reference/en/html/quickstart.html#3rdpartylibs)

dom4j
CGLIB
Commons Collections
Commons Logging
ODMG4
EHCache

_fs

Colocou no diretório certo, mas o jar que está faltando não é do hibernate, mas sim do pacote Javax.

http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=78&t=000014

P

Putz LIPE, desculpa cara, mas não acredito que seja esse o problema, eu acabei de entrar no link q vc enviou e o erro é mesmo exatamente igual e resolveram o problema adicionando o jta.jar no classpath, mas como vc pode ver no tópico acima, eu nem nada deste jar(creio eu).
Se fosse o problema do jar, a classe nem deveria instância, porém o erro é num chamada de método.

LIPE se eu falei besteira por favor me corrija…

_fs

Cara, esse tipo de Exception

java.lang.NoClassDefFoundError: javax/transaction/Synchronization

Indica que alguém tentou instanciar uma classe que a aplicação não conhece.

No seu caso, quem tentou foi o Hibernate, não uma classe escrita por você.

net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:312)

Estranho esse jar já não estar no lugar certo, então, coloca ele lá!

P

Ok Lipe!
Entendi sua explicação, vou adicionar o jta.jar no meu classpath e depois postarei o resultado.

P

Lipe, fiz a inclusão do jta.jar no diretório WEB-INflib e tive que fazer umas alterações no hibernate.properties e até que enfim retornou informações do banco de dados! :smiley:

Porém tem dois detalhes que gostaria de mostrar, quando eu finalizo e reinicio o TOMCAT acontece o seguinte erro.

Erro TOMCAT

SEVERE: IOException while loading persisted sessions: java.io.WriteAbortedExcept
ion: writing aborted; java.io.NotSerializableException: br.com.tutorialfmu.quest
ionario.Materia
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException
: br.com.tutorialfmu.questionario.Materia
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1278)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
        at java.util.ArrayList.readObject(ArrayList.java:547)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:838
)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1746)

        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
646)

O outro detalhe é sobre uma query que tive que montar. Uma vez eu tinha postado uma pergunta sobre como usar a função random() do POSTGRE aí vc deu uma idéia de usar java.lang.Math.Random() na consulta do hibernate, porém quando faço isso o POSTGRE retorna:

ERROR:  non-integer constant in ORDER BY

Aí acabei colocando a função random dentro da query como esta abaixo.
Você acha q com isso estou afetando a portabilidade?

from materia in class br.com.tutorialfmu.questionario.Materia where materia.id > 0 order by random()
_fs

Cara, é um chute, mas esta classe a ser persistida extende Serializable?

E sobre a outra pergunta:
Se algum outro banco não tem o método random(), sim, afeta a portabilidade.
Uma pergunta: quando você fez Math.random() no seu código java, você arredondou o número para um inteiro? Porque o método Math.random() gera um número aleatório entre 0 e 1.

P

Então LIPE, eu pensei em extender Serializable mas nos tutoriais que vi aqui no GUJ e na própria documentação do HIBERNATE não extendia.
Acho que devo fazer isso???

Sobre o que vc disse em arrendondar eu fiz isso sim quando deu problema pela primeira vez, porém existem vezes que o número gerado fica próximo de ZERO aí quando faz o arrendondamento para inteiro o número fica zerado e quando isso acontece o ordenamento não funciona.
Por isso fiquei idéia do que fazer…

_fs

Cara, o lance de serializable, não entendo o bastante de hibernate para poder te ajudar :expressionless:

Mas quanto ao random, se o número passado para a query não for um inteiro, não funciona. Por exemplo, 1,0000001 já não funcionaria hehe.

int i = Math.round( Math.random() * 100 ) // random entre 0 e 100

P

Blz LIPE vou fazer mais uns testes sobre a questão do random() aí digo depois quais foram os resultados.

Bom, sobre o lance do serializable vamos ver se outra pessoa aqui no guj já passou por isso! :smiley:

P

LIPE, como disse anteriormente eu fiz os testes relacionado ao random. Porém não fui muito feliz. Vamos aos detalhes.

Quando fazemos assim no POSTGRE:

SELECT * FROM tabela ORDER BY random();

Ele cria vamos dizer uma “coluna virtual” para cada registro, onde como valor desta coluna tem um valor random float (Ex: 0.65241478253695), quando é executado a cláusula ORDER BY random() o POSTGRE simplesmente ordena os registros por esta coluna, passando o resultado que eu desejo que é recuperar registros aleatóriamente.

Isso explica o pq não adianta passar um valor random() através da minha classe, pois o resultado seria um valor fixo para a cláusula ORDER BY.
Exemplo:

SELECT * FROM tabela ORDER BY 1

O valor constante “1” pode variar mas não mostaria os registros aleatóriamente como demonstrei acima, o resultado obtido seria o registro cujo ID fosse 1 como primeiro registro.

Essa foi a explicação que encontrei, e em resumo não posso simplesmente passar um valor random para a cláusula ORDER BY, uma possível solução talvez seria eu mesmo randomizar os registros após os dados serem retornados pelo HIBERNATE ou passar mesmo random() pela HQL mesmo sabendo que poderia prejudicar a portabilidade. (isso se o hibernate não tem uma forma de fazer isso que eu não conheça :smiley: ).

Bom, acho que esgotei esse assunto!
A menos que vc tenha alguma outra idéia. hehe

Ah! A questão sobre o erro que tinha dado quando inicializava o TOMCAT e vc deu a idéia de implementar Serializable funcionou, pelo menos eu não vi mais o erro na inicialização do TOMCAT, a pulga atrás da orelha q ficou é pq nos exemplos dados no site do HIBERNATE não faziam essa implementação. Estranho né?

[]'s

_fs

NOs docs do hibernate ele fala bastante coisa sobre Serialização, dá uma lida.

E sobre o random() poxa, bela descoberta cara!

Criado 16 de julho de 2004
Ultima resposta 22 de jul. de 2004
Respostas 15
Participantes 3