IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

SessionFactory JNDI et datasource


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Par défaut SessionFactory JNDI et datasource
    Bonjour,

    Je suis confronté au fameux problème java.lang.IllegalStateException: Could not locate the famous SessionFactory in JNDI.

    J'ai généré les pojo et DAO d'une bdd sous Mysql via hibernate tools et j'essaie d'utiliser les DAO pour requeter en base. J'utilise Hibernate 4.0, tomcat 7.0 et le driver JDBC (fichier mysql-connector-java-5.1.18-bin.jar) qui se trouve dans le repertoire /lib de tomcat.


    Mon code de test de DAO (requête d'un utilisateur qui s'appelle "test"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public void testerMoi(){
    		// TODO Auto-generated method stub
     
    		Utilisateur user = new Utilisateur();
    		user.setNom("test");
     
    		UtilisateurHome userDAO = new UtilisateurHome();
    		List userList = userDAO.findByExample(user);
     
    		System.out.println(userList);		
     
    	}
    Le DAO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class UtilisateurHome {
     
        private static final Log log = LogFactory.getLog(UtilisateurHome.class);
     
        private final SessionFactory sessionFactory = getSessionFactory();
     
        protected SessionFactory getSessionFactory() {
            try {
                //return (SessionFactory) new InitialContext().lookup("SessionFactory");
            	return (SessionFactory) new InitialContext().lookup("java:comp/env/jdbc/javatest");
            }
            catch (Exception e) {
                log.error("Could not locate the famous SessionFactory in JNDI", e);
                throw new IllegalStateException("Could not locate the famous SessionFactory in JNDI");
            }
        }
    ...
    Mon web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    	id="WebApp_ID" version="3.0">
    	<display-name>HibernateTest2</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
     
    	<resource-ref>
    		<description>
    		    Connection Pool: 
    		    Resource reference to a factory for java.sql.Connection
    		    instances that may be used for talking to a particular
    		    database that is configured in the Context
    		    configurartion for the web application.
      		</description>
    		<res-ref-name>jdbc/javatest</res-ref-name>
    		<res-type>javax.sql.DataSource</res-type>
    		<res-auth>Container</res-auth>
    	</resource-ref>
     
    </web-app>
    Mon context.xml dans le repertoire META-INF de ma webapp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version='1.0' encoding='utf-8'?>
     
    <Context>
     
    	<Resource name="jdbc/javatest"
    		auth="Container"
    		type="javax.sql.DataSource"
    		username="javauser" 
    		password="javauser" 
    		driverClassName="com.mysql.jdbc.Driver"
    		url="jdbc:mysql://localhost/bddprofils2" 
    		maxActive="8" 
    		maxIdle="4" />
     
    </Context>
    Quelle configuration ai-je loupé ?
    Merci.

  2. #2
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Salut,

    Il te manque le fichier de configuration de la session factory Hibernate (hibernate.cfg.xml ou persistence.xml).

    De plus il y a une confusion dans les ressources JNDI : la ressource que tu charges correspond en réalité à la datasource du serveur d'appli alors que, dans ton code, tu souhaites charger la "session factory" Hibernate.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Par défaut
    Salut,
    Merci pour la réponse.
    Oui je m’emmêle un peu les pinceaux je pense.
    Vu que les DAO auto générés recherchent un JNDI par défaut dans la création du sessionFactory, je me suis lancé dans la config du datasource accessible via JNDI.


    Mon hibernate.cfg.xml ressemble à ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?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.connection.datasource">jdbc/javatest</property>
     
    <!-- Defines the SQL dialect used in Hiberante's application -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
     
    <!-- Display and format all executed SQL to stdout -->
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
     
    </session-factory>
    </hibernate-configuration>

    je crois qu'il me manque le bind du sessionFactory:
    hibernate.session_factory_name (cf. doc Hibernate 4.0)
    Qu'en penses tu?
    Je vais tester.

  4. #4
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Je crains que ça ne soit pas suffisant. Même si l'utilisation du paramètre hibernate.session_factory_name te permettra effectivement de référencer et d'obtenir ta session factory par un accès JNDI, il reste qu'il te faudra initialiser ta session factory (dans le § que tu mentionnes, ça correspond à l'expression cfg.buildSessionFactory()).

    Plutôt qu'utiliser JNDI pour obtenir la session factory, tu peux tout simplement la déclarer en tant que variable statique (c'est un élément thread-safe). Tu peux par exemple t'inspirer de la classe HibernateUtil décrite ici dans la doc Hibernate.

Discussions similaires

  1. [JNDI][DATASOURCES] jdbc -> datasources
    Par mlequim dans le forum JDBC
    Réponses: 6
    Dernier message: 15/04/2009, 09h58
  2. Comment utiliser une datasource JNDI avec JDBC?
    Par KING_OF_GRACELAND dans le forum JDBC
    Réponses: 6
    Dernier message: 08/04/2008, 18h18
  3. Problème nom JNDI + datasource
    Par javasmif dans le forum Weblogic
    Réponses: 1
    Dernier message: 11/12/2007, 11h13
  4. Problème nom JNDI pour Datasource
    Par Nysmensys dans le forum JOnAS
    Réponses: 2
    Dernier message: 22/03/2007, 09h29
  5. [Datasource] [JNDI] Problème de nommage
    Par legzo dans le forum Wildfly/JBoss
    Réponses: 5
    Dernier message: 29/01/2007, 15h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo