Hibernate 2 com webwork

29 respostas
L

Galera, estou “tentando” rodar o hibernate 2 com o webwork.

Bom, configurei o hibernate no server.xml adicionando o contexto, os arquivos hibernate.cfg.xml e o mapeamento da minha classe.

Porém, ocorre aquela nossa querida cachoeira de execeções…

Resumidamente falando…

Caused by: Initial SessionFactory creation failed net.sf.hibernate.HibernateException: Could not find datasource.
.
.
.
Caused by: javax.naming.NameNotFoundException: Name icarus is not bound in this Context

Acredito que são apenas problemas de configuração nos xml. Eu revisei os arquivos, talves database name ou algum parâmetro de acesso ao sgbd errado, porém, não encontrei nada incorreto no acesso propriamente dito.

Alguém já teve um problema semelhante?

Valeu pessoal, aguardo qualquer dica.

[]'s.
Leo Lima

29 Respostas

_fs

Posta o seu hibernate.cfg.xml e/ou seu hibernate.properties

Não se esqueça de remover informações sobre usuário e senha.

L

Cara, tu chegaste a criar um dataSource para o teu contexto no Tomcat?

A princípio passei pelo mesmo problema e consegui resolver após criar o mesmo no Tomcat.

Pode fazê-lo através do Tomcat Admin ou criando este arquivo no seguinte caminho: TOMCAT_HOME/conf/Catalina/localhost/

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="_NOME_DA_APLICACAO_" path="/_NOME_DA_APLICACAO_" workDir="_CAMINHO_ONDE_APLICACAO_ESTA_ARMAZENADA_">
  <Resource name="jdbc/_NOME_DA_BASE" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/_NOME_DA_BASE">
    <parameter>
      <name>url</name>
      <value>jdbc:jtds:sybase://100.100.100.10:4100/_NOME_DA_BASE;TDS=5.0</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>_SENHA_DO_USUARIO_DA_BASE_</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>4</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>net.sourceforge.jtds.jdbc.Driver</value> <!-- DRIVER DO BD QUE TU ESTIVER UTILIZANDO -->
    </parameter>
    <parameter>
      <name>username</name>
      <value>_USUARIO_DA_BASE_</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>2</value>
    </parameter>
  </ResourceParams>
</Context>
L

Como o Jack Estripador, vamos em partes.. vou colocar o contexto do server.xml para vcs verem..

<Context path="/wad" docBase="wad">
    <Resource name="/jdbc/wad" scope="Shareable" type="javax.sql.DataSource"/>
    <ResourceParams name="wad">
        <parameter>
            <name>factory</name>
            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
        </parameter>

        <!-- connection configuration -->
        <parameter>
            <name>url</name>
            <value>jdbc:mysql://192.168.212.184:3306/mundial</value>
        </parameter>
        <parameter>
            <name>driverClassName</name><value>com.mysql.jdbc.Driver</value>
        </parameter>
        <parameter>
            <name>username</name>
            <value>usuario</value>
        </parameter>
        <parameter>
            <name>password</name>
            <value>senha</value>
        </parameter>

        <!--  pooling options -->
        <parameter>
            <name>maxWait</name>
            <value>3000</value>
        </parameter>
        <parameter>
            <name>maxIdle</name>
            <value>100</value>
        </parameter>
        <parameter>
            <name>maxActive</name>
            <value>10</value>
        </parameter>
    </ResourceParams>
</Context>

Bom, as vezes deixamos passar algo, mas parece que tudo está certo.

_fs

Bem, aparentemente você está chamando um datasource chamado ‘icarus’

Caused by: javax.naming.NameNotFoundException: Name icarus is not bound in this Context

mas na verdade o nome dele é ‘wad’

&lt;ResourceParams name="wad"&gt;
L

Foi mal LIPE, acabei fazendo umas modificações e não enviei a informação coerentemente.

Na realidade segue assim..

server.xml
<Context path="/wad" docBase="wad">
    <Resource name="jdbc/icarus" scope="Shareable" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/icarus">
        <parameter>
            <name>factory</name>
            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
        </parameter>

        <!-- DBCP database connection settings -->
        <parameter>
            <name>url</name>
            <value>jdbc:mysql://192.168.212.184:3306/icarus</value>
        </parameter>
        <parameter>
            <name>driverClassName</name><value>com.mysql.jdbc.Driver</value>
        </parameter>
        <parameter>
            <name>username</name>
            <value>usuario</value>
        </parameter>
        <parameter>
            <name>password</name>
            <value>senha</value>
        </parameter>

        <!-- DBCP connection pooling options -->
        <parameter>
            <name>maxWait</name>
            <value>3000</value>
        </parameter>
        <parameter>
            <name>maxIdle</name>
            <value>100</value>
        </parameter>
        <parameter>
            <name>maxActive</name>
            <value>10</value>
        </parameter>
    </ResourceParams>
</Context>
hibernate.cfg.xml
<?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">jdbc/icarus</property>
        <property name="show_sql">false</property>
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>

        <!-- Mapping files -->
        <mapping resource="Cliente.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

[]'s

Leo.

_fs

Este link te ajuda?
http://www.hibernate.org/114.html

L

Trabalheira né cara? Essas intermináveis customizações das configurações as vezes me aborrecem…

Put here, paste there… change it, add it… try it, therefore… did work?

WebWork, Hibernate e Velocity.

Um milhão de .xml, .properties… im boring…

Vc usa o Xdoclet LIPE? Achei bom o conceito, mas a prática, não sei…
Vejo que tens experiência e como grande defensor do WW talves tenha se deparado com essa situação, alguma sugestão?

_fs

Cara, o que você faz no xml inevitavelmente faria dentro de Java de qualquer maneira. Já que esse tipo de informação (nomes, urls, ips) muda com uma certa frequência, eu acho ótimo poder alterar sem ter que recompilar qualquer coisa.

Mas com certeza absoluta é um SACO colocar o bixo pra funcionar. Mas depois desse passo fica bem menos dolorido.

E quanto a XDoclet … bem, eu fico nervoso (no sentido de neurotico) com qualquer ferramenta que gere código para mim. Portanto, salvo raríssimas exceções como relatórios, prefiro escrever tudo à mão.

Depois que se acostumar com os arquivos e tiver os básicos funcionando, vai se impressionar com o que esse Trio é capaz de fazer hehe delicioso :smiley:

L

LIPE, mantive os esforços e tive um tímido avanço.

Agora acontece o seguinte…

“Cannot create JDBC driver of class ‘’ for connect URL ‘null’”

A URL nula?? isso que eu não entendi, server.xml e hibernate.properties estão aparentemente corretos.

Do you have any tip?

_fs

Bem, aparentemente estão apenas aparentemente corretos hehe

Bem, o parametro URL deveria ser declarado apenas no datasource. Você está utilizando também o hibernate.properties? Se sim, postaí pra gente :smiley:

L

Poisé, se está sendo informado a URL, e os parâmentros do banco no server.xml. Qual o objetivo de haver o hibernate.properties?

A lógica seria por acaso -> se não houver um hibernate.properties no contexto da aplicação, os parâmetros de acesso ficam então a mão do server.xml?

Ou seja, cada aplicação do servidor pode precisar de uma configuração especial para o hibernate acessar os dados, então cada contexto pode ter seu próprio hibernate.properties. Caso contrário, o hibernate utiliza os parâmetros do server.xml.

Seria isso?

fiz dois testes, assim…

hibernate.connection.driver_class = com.mysql.jdbc.Driver # o driver
hibernate.connection.url = jdbc:mysql://192.168.212.184:3306/icarus # a url
hibernate.connection.username = insenic # o username
hibernate.connection.password = insenic # a senha

e assim…

hibernate.connection.driver_class = com.mysql.jdbc.Driver # o driver
hibernate.connection.url = jdbc:mysql://192.168.212.184:3306/icarus?user=usr&password=pass # a url

Bom, como pode-se ver, aqui ilustrei os parâmetros.

caiofilipini

Bom, se você está usando um DataSource, não deveria passar os parâmetros da conexão, mas o nome JNDI do seu DataSource:

hibernate.connection.datasource = java:/comp/env/MyDataSource

[]'s

L

Tenho sério problema para notar detalhes, preciso desenvolver isso. Fiz isso como vc disse caio, e nada!

Meu server.xml é aquele que postei anteriormente, a tag context está escrita na seguinte hieraquia…

&lt;Engine&gt;< Host> <\Context ..

È isso?

o hibernate.cfg.xml é o mesmo publicado. Lá dentro tem “connection.datasource” então pra que colocar no hibernate.properties também, na realidade ainda nao vi utilidade pra ele…

o hibernate.properties é o que o caio me sugeriu. Tentei iniciar o servidor sem ele, e o erro simplesmente foi o mesmo. O hibernate.properties é essencial? È possivel que ele nao esteja sendo encontrado em “WEB-INF\classes” ?

Erro - > “Cannot create JDBC driver of class ‘’ for connect URL ‘null’”.

Galera, tá ficando cansativo pra vcs esse topico né? Foi mal, mas não é por acaso que vcs tantas mensagems publicadas, não é mesmo…

free your mind!

[]'s.

_fs

Não é necessário o hibernate.properties no seu caso. Ele é útil quando precisa alterar as propriedades un runtime.

Por estar usando datasource, você não precisa declarar nada relacionado à conexão com o banco (user, url, pwd).

Como o caio apontou, troque a linha da declaração do datasource no hibernate.cfg.xml para

&lt;property name="connection.datasource"&gt;java:/comp/env/jdbc/icarus&lt;/property&gt;

E relaxa quanto às mensagens cara :smiley: configurar é sempre uma chatisse.

eduardo_lopes

galera, qual tomcat é esse q vcs estão usando? no tomcat 5 (ou 5.5) o datasource é definido de forma diferente:

&lt;Context
       		path="/app"
       		docBase="app"&gt;
       		&lt;Resource
       			name="jdbc/app_db"
       			auth="Container"
       			type="javax.sql.DataSource"
       			driverClassName="driver.class"
       			url="jdbc:@//servidor:porta/servico_ou_bd"
       			username="user"
       			password="pass"
       			maxActive="30"
       			maxIdle="10"
       			maxWait="-1"/&gt;
&lt;/Context&gt;

:roll:

L

E ai galera…

Fiz, refiz todos os passos, e as coisas parecem começarem a serem melhor compreendidas. Eu agora estou com um erro famoso, “no suitable driver”, porém,
meu jdbc driver no caso mysql, está dentro do path global do meu container “TOMCAT/common/lib” como sugerido na documentação do Hibernate. Imaginei que fosse talves uma imcompatibilidade da versão do driver, porém baixei a versão de produção mais atual e nada.

  • Detalhe, o acesso via jdbc sem o hibernate “no braço”, funciona.

Alguma idéia?

_fs

Poxa, isso aqui

driverClassName="driver.class"

não resolve nada né? hehe

Entre no site do driver e veja qual o pacote e classe corretos :thumbup:

eduardo_lopes

ahhahaha… essa foi boa Lipe… eu só queria demonstrar como era e daí não coloquei o nome do pacote né? rs…

L

Acho que o LIPE pensou que fui eu que publiquei o codigo, e logo depois coloquei a duvida… hehehe!

Essa foi engraçada mesmo…

_fs

Nossa viajei hehe :XD:

Tente colocar o driver na basta LIB da sua webapp.

L

Não adiantou LIPE, mas achei uma coisa interessante…

se eu coloco o hibernate properties o erro fica,

"Name icarus is not bound in this Context"

se eu tiro o hibernate.properties, ou seja a tag “hibernate.connection.driver_class” realmente parece estar sendo usada… acontece o seguinte:

" No suitable driver."

O “<Context>” eu coloco dentro da tag <host> do server.xml, ou o coloco no arquivo context.xml??

De qualquer forma tentei o colocar o context em varios lugares, e em ambas as maneiras da na mesma…

Cara, estou achando que é algo tolo que estou esquecendo…

Já investi quase uma semana pra tentar rodar isso, e, definitivamente minha paciência está sendo colocada a prova…

_fs

claro que é alguma coisa boba :smiley:

Já tentou sem usar datasource? Definindo url, user, pass e driver no próprio hibernate.cfg.xml?

eduardo_lopes

cara, tente fazer isso:

&lt;property name="connection.datasource"&gt;java:comp/env/jdbc/APP&lt;/property&gt;

notei que no seu hibernate.cfg não tem o “java:comp/env…” tenta aí!

L

Cara, sinceramente… estou ficando desapontando. Passar o final de semana sem resolver isso hehehehe…

chequei o server.xml, hibernate.cfg.xml, hibernate.properties, os mapeamentos, fiz uma classe SessionFactory. E mesmo assim, a criança chora…

Vou apagar tudo e fazer de novo… haha.

Cara definitivamente, não acho a documentação de instalação do hibernate descente…

L

Finally, it works!

Muito obrigado pela ajuda galera, acabei refazendo tudo, passo a passo e tudo deu certo! Com uma ajudinha do Tomcat Administrator.

Estou emocionado!

[]'s.

_fs

hehe creio que todos aqui conhecem essa sensação de alegria após a batalha da configuração :smiley: parabéns :smiley: e até a próxima :XD:

Filipi_Silveira

Amigos, duas perguntas:

1 - Se eu fosse usar o arquivo hibernate.cfg.xml ao invés de hibernate.properties, em que diretório devo salvar esse arquivo XML?

2 - Um arquivo hibernate.properties com o seguinte conteúdo poderia estar certo?

hibernate.connection.datasource=java:comp/env/jdbc/postgres
hibernate.dialect=net.sf.hibernate.dialect.PostgreSQLDialect

Digo isso porque já vi lugares em que o datasource aparece como “java:comp…” e outros como “java:/comp…” (com a barra) e não qual dois está certo já que nenhum funcionou pra mim. :frowning:

Filipi_Silveira

Os erros que estão acontecendo é o seguinte…

2005-03-27 19:36:04,024 WARN  hibernate.cfg.SettingsFactory  -> Could not obtain connection metadata
 org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
2005-03-27 19:36:10,173 INFO  hibernate.impl.SessionFactoryObjectFactory  -> Not binding factory to JNDI, no JNDI name configured
2005-03-27 19:36:10,543 DEBUG hibernate.util.JDBCExceptionReporter  -> Cannot open connection
 org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

Obrigado.

Filipi P. Silveira

L

hibernate.cfg.xml

&lt;property name="connection.datasource"&gt;java:comp/env/jdbc/icarus&lt;/property&gt;
        &lt;property name="show_sql"&gt;false&lt;/property&gt;
	&lt;property name="use_outer_join"&gt;true&lt;/property&gt;
        &lt;property name="dialect"&gt;net.sf.hibernate.dialect.MySQLDialect&lt;/property&gt;
	&lt;property name="hibernate.setup"&gt;true>&lt;/property&gt;

O Context do server.xml vc pode criar atraves do admin do tomcat, fica bem mais simples. Não tem erro. O Admin Tool não vem mais no bundle do tomcat a partir da versao 5.5.25 se não me engano. Entao vc terá que baixa-lo.

Mas, caso queira fazer manual…

&lt;Engine defaultHost="localhost" name="Catalina"&gt;
      &lt;Host appBase="webapps" name="localhost"&gt;
        &lt;Context .. seu contexto&gt;&lt;/Host&gt;
    &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"/&gt;
    &lt;/Engine&gt;

Essa estrutura foi a que melhor se comportou. Aí o context segue a documentação do hibernate.

[]'s.

Criado 28 de fevereiro de 2005
Ultima resposta 28 de mar. de 2005
Respostas 29
Participantes 6