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 :

[Configuration] Confg par programmation : manque le datasource


Sujet :

Hibernate Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Configuration] Confg par programmation : manque le datasource
    Bonjour,

    Nous avons une série de DAOS réalisés avec hibrenate pour une application Web. Je dois mettre ne place une application Swing pour les mêmes tables. Je voudrais donc réutiliser les daos Hibernate pour ne pas tu réécrire.

    L'outil que je dois ecrire vas recherche dans un fichier ".properties" les paramètres de connexions (serveur, utilisateur et mot de passe).
    J'ai écris une classe devant me servir à récupèrer la SessionFactory :
    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
    30
    public HibernateUtil(Properties properties) {
    		String url = new StringBuilder("jdbc:postgresql://")
    			.append(properties.getProperty("db.host"))
    			.append(":").append(properties.getProperty("db.port","5432"))
    			.append("/").append(properties.getProperty("db.name","DEFAULT"))
    			.toString();
     
    		Configuration cfg = new Configuration()
    			.configure("./hibernate.cfg.xml")
    			// Hard coded properties
    			.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver")
    			.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect")
    			.setProperty("hibernate.connection.pool_size", "1")
    			// Dynamic properties
    			.setProperty("hibernate.connection.url", url)
    			.setProperty("hibernate.connection.username", properties.getProperty("db.user"))
    			.setProperty("hibernate.connection.password", properties.getProperty("db.password"))
    			// Mappings
    			.addResource("me/app/hibernate/mappings/menu.hbm.xml")
    			.addResource("me/app/hibernate/mappings/user.hbm.xml")
    			.addResource("me/app/hibernate/mappings/nationality.hbm.xml")
    			.addResource("me/app/hibernate/mappings/role.hbm.xml")
    			// Configuration
    			.configure();		
    		try {
    			sessionFactory = cfg.buildSessionFactory();
    		} catch (Throwable e) {
    			throw new ExceptionInInitializerError(e);
    		}
    	}
    Mais ce code me lance cette exception (sur la ligne "sessionFactory = cfg.buildSessionFactory()"):
    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.getNameParser(InitialContext.java:480)
    at org.hibernate.util.NamingHelper.bind(NamingHelper.java:52)
    at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:90)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:306)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
    at me.hibernate.HibernateUtil.<init>(HibernateUtil.java:42)
    at me.hibernate.NiocHibernateDaoFactory.<init>(NiocHibernateDaoFactory.java:36)
    at me.Administrator.preInit(Administrator.java:56)
    at fabric.app.Application.startOnEDT(Application.java:416)
    at fabric.app.Application.access$0(Application.java:415)
    at fabric.app.Application$Handler.run(Application.java:703)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    J'ai bien compris qu'il faut que je lui fournisse un DataSource mais je ne vois absolument pas comment. Je rappelle que mon application est une application Swing.

    Dans la doc d'hibernate il est bien expliqué comment le configurer via JNDI mais je ne suis pas dans une application serveur disposant de JNDI.


    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    Il faut que tu installe et configure une API qui fournisse une datasource, comme par exemple C3p0:
    http://sourceforge.net/projects/c3p0/

    c'est le serveur d'application qui fournit ce service d'habitude.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 64
    Points : 59
    Points
    59
    Par défaut
    Il faut surtout que tu crées ton bean dataSource.... sinon je pense qu'il va y avoir un petit souci, voici un exemple :
    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
    <!-- MYSQL -->
    <bean id="dataSource"
    	class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    	<property name="driverClassName">
    		<value>com.mysql.jdbc.Driver</value>
    	</property>
    	<property name="url">
    		<value>jdbc:mysql://localhost/mabase</value>
    	</property>
    	<property name="username">
    		<value>user</value>
    	</property>
    	<property name="password">
    		<value>password</value>
    	</property>
    </bean>
    J'espère que ça peut t'aider....

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci à vous deux. J'ai bien compris qu'il fallait que je configure un DataSource mais dans mon cas je n'utilise pas Spring et pas de fichier de configuration Hibernate. Je dois donc configurer manuellement mon DataSource (ça, ça va) mais ensuite le renseigner à Hibernate et c'est la que je bloque.

    Une fois que j'ai instancié et configuré mon DataSource, comment le donner à org.hibernate.cfg.Configuration ou à org.hibernate.SessionFactory pour ne plus obtenir l'exception décrite dans mon premier post :
    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.getNameParser(InitialContext.java:480)
    ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    Tu dois ajouter le nom JNDI de ta datasource (par exemple maDataSource) à la configuration Hibernate :
    .setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/maDataSource")

    Mais pour ça tu dois avoir un provider JNDI auprès duquel tu enregistres ta datasource (normalement ça se fait simplement dans n'importe quel serveur d'application).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par slevy Voir le message
    (normalement ça se fait simplement dans n'importe quel serveur d'application).
    Merci mais moi je suis en Swing, donc pas de serveur d'application.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    oui, c'est pour ça que tu dois utiliser un provider JNDI standalone.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Normalement, tu n'as pas l'obligation de passer par un datasource.
    Cela fonctionne très bien sans.
    Reste à comprendre pourquoi tu as une erreur liée à cela.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    A ce moment là peut-être qu'il ne faut pas mettre cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .setProperty("hibernate.connection.pool_size", "1")

  10. #10
    Invité
    Invité(e)
    Par défaut
    J'ai solutionné mon problème mais vos réponses m'intéressent beaucoup. Pour les éventuels pressés, la réponse et en bas de ce post.

    Citation Envoyé par slevy Voir le message
    oui, c'est pour ça que tu dois utiliser un provider JNDI standalone.
    Alors la, tu m'intéresse. Je ne savais pas qu'il était possible d'embarquer un provider JNDI..


    Citation Envoyé par fr1man Voir le message
    Normalement, tu n'as pas l'obligation de passer par un datasource.
    Cela fonctionne très bien sans.
    Reste à comprendre pourquoi tu as une erreur liée à cela.
    Appremment, si. Le truc c'est que si on en précise pas un, Hibernate utilise le sien.

    Citation Envoyé par slevy
    A ce moment là peut-être qu'il ne faut pas mettre cette ligne ?
    Cette option est la car je suis dans une application Swing, je n'ai donc absolument pas besoin de plusieurs connections..


    La solution :
    Le truc c'est que je créais ma Configuration d'une mauvaise manière et que je treminais par un '.configure()' qui écrasais toute ma configuration précédente. Ma classe 'HibernateUtil' ressemble maintenant à ceci :
    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
    public HibernateUtil(Properties properties) {
          this(properties, new File("./hibernate.cfg.xml"));
       }
     
       public HibernateUtil(Properties properties, File hibernateCfg) {         
          Configuration cfg = new Configuration()
             // Mappings      
             .addResource(...")
     
             // Dynamic properties (user editables : url, username, password)
             .setProperties(properties)
     
             // Core properties (from hibernate.cfg.xml)
             .configure(hibernateCfg);
          try {
             sessionFactory = cfg.buildSessionFactory();
          } catch (Throwable e) {
             throw new ExceptionInInitializerError(e);
          }
       }
     
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je pense que tu mélanges un peu tout.
    Pour configurer ta base de données, tu as deux solutions :
    - la première est l'utilisation d'un datasource qui correspond à une source de données déclarées dans un serveur d'application et accessible par JNDI
    - l'utilisation directe via les propriétés de ta base, url, login, mot de passe

    Tu choisis l'une ou l'autre et tu peux évidemment te passer d'un datasource.

    En ce qui concerne le pool de connexions, tu peux très bien en utiliser un avec ton application Swing, si par exemple tu effectues des traitements en parallèle.
    Là encore, deux options:
    - passer par le pool de ton serveur d'application
    - configurer un pool via C3PO ou autre

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fr1man Voir le message
    En ce qui concerne le pool de connexions, tu peux très bien en utiliser un avec ton application Swing, si par exemple tu effectues des traitements en parallèle.
    Là encore, deux options:
    - passer par le pool de ton serveur d'application
    * Dans un premier temps, je n'aurais pas de traitements en parallèles. Si même j'en avais, je pourrais conserver une seule connexion dans mon pool, le traitement serait seulement mis en attente jusqu'a ce que la connexion sois libre non ?

    * L'idée de passer par le pool de mon serveur d'application me plait beaucoup mais comment est-il possible de faire cela ?

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je pense que l'utilisation du datasource se fait avec le code hibernate exécuté côté serveur, ce qui n'a pas l'air d'être ton cas.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Je pense que l'utilisation du datasource se fait avec le code hibernate exécuté côté serveur, ce qui n'a pas l'air d'être ton cas.
    Non, en effet. Je me contenterais donc de ma "solution" actuelle.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/02/2009, 22h01
  2. Réponses: 2
    Dernier message: 06/07/2007, 18h17
  3. configurer odbc par programmation
    Par devalender dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 28/02/2007, 22h41
  4. Configurer odbc par programmation
    Par devalender dans le forum WinDev
    Réponses: 3
    Dernier message: 30/06/2006, 23h02
  5. Configurer la carte réseau par programmation
    Par Deedier dans le forum Développement
    Réponses: 2
    Dernier message: 25/07/2005, 19h44

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