Conexão do Hibernate com DataSource JNDI

0 respostas
llucas

Oi Pessoal
Eu estou com o seguinte problema
Eu ja fiz algumas aplicações com JSF e Hibernate e agora quero usar spring security

Eu fazia a conexão com o banco de dados com "hibernate.cfg.xml" "HibernateUtil.java" "Dao.java" normalmente
Então vi uns exemplos onde (pelo que eu entendi) se configura a conexão fora do arquivo "hibernate.cfg.xml" no arquivo "META-INF/context.xml" para se usar as mesmas configurações de conexão para o hibernate e o springs.

Primeiro eu resolvi testar essa maneira de configurar a conexão e ver se o hibernate continuava funcionando

Eu adicionei essas configurações no web.xml
<resource-ref>
        <description>DataSource TesteSpringDataSource</description>
        <res-ref-name>jdbc/TesteSpringDataSource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>
Meu "META-INF/context.xml" ficou assim:
<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="/Springs" reloadable="true">
  <Resource name="jdbc/TesteSpringDataSource"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30"
    maxWait="10000"
    username="root"
    password="root"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/springsecurity?autoReconnect=true" />
</Context>
No "hibernate.cfg.xml" troquei essas linhas:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/springsecurity?autoReconnect=true</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
Por Essa:
<property name="connection.datasource">java:/comp/env/jdbc/TesteSpringDataSource</property>
Então eu rodei uma aplicação apenas para imprimir um nome do banco de dados e ver se tava funcionando normal, e deu o seguinte erro
12:06:12.755 [main] ERROR o.h.c.DatasourceConnectionProvider - Could not find datasource: java:env/jdbc/TesteSpringDataSource
Initial Session creation failed.org.hibernate.HibernateException: Could not find datasource
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
Exception in thread "main" java.lang.ExceptionInInitializerError
        at util.HibernateUtil.<clinit>(HibernateUtil.java:30)
        at dao.Dao.<init>(Dao.java:15)
        at modelo.Usuario.getDao(Usuario.java:160)
        at aplicacao.Teste.main(Teste.java:17)
Caused by: org.hibernate.HibernateException: Could not find datasource
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) ~[na:1.6.0_17]
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) ~[na:1.6.0_17]
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325) ~[na:1.6.0_17]
        at javax.naming.InitialContext.lookup(InitialContext.java:392) ~[na:1.6.0_17]
        at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:56)
        at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
        at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
        at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414)
        at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
        at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
        at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
        at util.HibernateUtil.<clinit>(HibernateUtil.java:26)
        ... 3 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52)
        ... 11 more
        at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52) ~[hibernate3.jar:3.2.5.ga]
        at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) [hibernate3.jar:3.2.5.ga]
        at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) [hibernate3.jar:3.2.5.ga]
        at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414) [hibernate3.jar:3.3.1.GA]
        at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) [hibernate3.jar:3.3.1.GA]
        at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) [hibernate3.jar:3.3.1.GA]
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) [hibernate3.jar:3.3.1.GA]
        at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) [hibernate-annotations.jar:3.3.1.GA]
        at util.HibernateUtil.<clinit>(HibernateUtil.java:26) [classes/:na]
        at dao.Dao.<init>(Dao.java:15) [classes/:na]
        at modelo.Usuario.getDao(Usuario.java:160) [classes/:na]
        at aplicacao.Teste.main(Teste.java:17) [classes/:na]
Java Result: 1

Eu quero saber se eu configurei alguma coisa errada nesses arquivos ou se eu preciso alterar alguma coisa no meu "Dao.java" ou no "HibernateUtil.java"

Ai vão os códigos completos: web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

    
    <!-- Spring Security -->
    <resource-ref>
        <description>DataSource TesteSpringDataSource</description>
        <res-ref-name>jdbc/TesteSpringDataSource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

</web-app>
context.xml:
<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="/Springs" reloadable="true">
  <Resource name="jdbc/TesteSpringDataSource"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30"
    maxWait="10000"
    username="root"
    password="root"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/springsecurity?autoReconnect=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>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <property name="connection.datasource">java:/comp/env/jdbc/TesteSpringDataSource</property>
    
    <mapping class="modelo.Permissoes" />
    <mapping class="modelo.Usuario" />

  </session-factory>
</hibernate-configuration>
HibernateUtil.java:
package util;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.Session;

public class HibernateUtil {
    private static final Session session;

    public HibernateUtil() { }

    static {
        try {
            session = new AnnotationConfiguration().configure().buildSessionFactory().openSession();
        } catch (Throwable ex) {
            System.err.println("Initial Session creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return session;
    }
}
Dao.java:
package dao;

import java.util.ArrayList;
import util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

public class Dao<DaoClass> {

    private Class persistentClass;
    private Session session = HibernateUtil.getSession();
    private Transaction transaction = session.getTransaction();

    public Dao(Class persistentClass) {
        this.transaction = session.getTransaction();
        this.persistentClass = persistentClass;
    }

    public void salvar(DaoClass daoClass) {
        transaction.begin();
        session.save(daoClass);
        transaction.commit();
    }

    public void salvarAtualizar(DaoClass daoClass) {
        transaction.begin();
        session.saveOrUpdate(daoClass);
        transaction.commit();
    }

    public void excluir(DaoClass daoClass) {
        transaction.begin();
        session.delete(daoClass);
        transaction.commit();
    }

    public DaoClass buscar(int id) {
        transaction.begin();
        return (DaoClass) session.load(persistentClass, id);
    }

    public ArrayList<DaoClass> getLista() {
        transaction.begin();
        return (ArrayList<DaoClass>) session.createCriteria(persistentClass).list();
    }

    public ArrayList<DaoClass> buscarPorCampo(String campo, String valor) {
        transaction.begin();
        return (ArrayList<DaoClass>) session.createCriteria(persistentClass).add(Restrictions.like(campo, valor)).list();
    }

}
Criado 19 de abril de 2011
Respostas 0
Participantes 1