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 :

Problème avec plusieurs ClassLoader


Sujet :

Hibernate Java

  1. #1
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut Problème avec plusieurs ClassLoader
    Bonjour,

    Je travaille sur une application modulaire (plug-in). Les plugin sont chargées dans un autre ClassLoader.

    Hibernate est défini dans le coeur de l'application et je donne la possibilité aux modules d'ajouter des classes persistantes (entités).

    Le problème est donc qu'Hibernate est donc dans le premier ClassLoader alors que les entités persistantes dans le second ClassLoader.

    Voici l'erreur que me donne Hibernate :

    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
    Exception in thread "Thread-2" javax.persistence.PersistenceException: org.hibernate.MappingException: entity class not found: org.jtheque.films.persistence.od.TypeImpl
    	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698)
    	at org.jtheque.core.modules.persistence.PersistenceManager.init(PersistenceManager.java:73)
    	at org.jtheque.core.modules.Managers.initManagers(Managers.java:74)
    	at org.jtheque.core.modules.Application$1.run(Application.java:148)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: org.hibernate.MappingException: entity class not found: org.jtheque.films.persistence.od.TypeImpl
    	at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:99)
    	at org.hibernate.validator.event.ValidateEventListener.initialize(ValidateEventListener.java:74)
    	at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:356)
    	at org.hibernate.cfg.Configuration.getInitializedEventListeners(Configuration.java:1228)
    	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1218)
    	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:691)
    	... 4 more
    Caused by: java.lang.ClassNotFoundException: org.jtheque.films.persistence.od.TypeImpl
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Unknown Source)
    	at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
    	at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:96)
    	... 9 more
    Cette erreur apparaît sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    emf = config.buildEntityManagerFactory();
    config étant un EJB3Configuration.

    Ce qui est bizarre, c'est qu'il arrive bien à lire ces classes, puisqu'il arrive à détecter des erreurs dans ces classes par exemple un "could not determine type for ..." parce que j'avais oublié de tagger quelque chose comme transient, mais ça n'a pas l'air ensuite de fonctionner...

    Je comprends pas vraiment pourquoi ?

    Donc : Est-ce que c'est possible avec Hibernate de travailler sur plusieurs ClassLoader différents ? Ou alors, est-ce qu'il y a une solution pour rajouter des classes dans le classloader d'Hibernate.

    Merci

    Baptiste

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Salut,

    J'ai l'impression que travailler avec plusieurs class loader avec hibernate parrait difficile, on dirait qu'il plante en essayant via son propre class loader de charger la classe...

    Hors je ne me rappelle pas avoir vu d'option permettant à Hibernate de se "connecter" par un quelconque moyen à un autre class loader..

    Il faudrait que tu trouves un moyen de préloader les classes persistentes dans ton class loader contenant hibernate pour que ton erreur ne se reproduise plus, je ne peux pas trop en dire plus, la question est à mon avis plus à sa place dans le forum hibernate où les developpeurs pourront eventuellement te donner une solution clé en main !

    Petite précision : ce que tu appelles un autre class loader, c'est une autre JVM ?

    A+

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    C'est bien ce que je pensais...

    ce n'est pas une autre JVM, c'est un URLClassLoader que je crée moi-même et dans lequel je charge les jars des modules de l'application...

    Le problème c'est que si j'essaie de rajouter juste les classes persistantes dans le classloader système, il faut aussi que j'y ajoute toutes les demandes et ça va vite faire beaucoup de classes à rajouter et je suis même pas sûr que ce soit possible...

    Sinon,est-ce qu'il y aurait un moyen de rajouter des jars dans le classloader système à la volée ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Hibernate utlise le context classloader, donc tu peux éventuellement jouer là dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.currentThread().setContextClassLoader(cl);

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    Hibernate utlise le context classloader, donc tu peux éventuellement jouer là dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.currentThread().setContextClassLoader(cl);
    C'est une idée, mais est-ce que Java utilise également ce context classloader pour charger les ressources nécessaires au code dans le thread ?

    Le problème étant que toute la la partie persitance se trouve dans le system classloader et que les classes persistantes se trouvent dans le classloader des modules...

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Normalement ton classloader a un parent qui est le classloader système, donc s'il ne trouve pas une ressource, il délègue à son parent qui normalement la trouve

  7. #7
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    Normalement ton classloader a un parent qui est le classloader système, donc s'il ne trouve pas une ressource, il délègue à son parent qui normalement la trouve
    Ah oui, c'est juste que dans ce sens ça devrait marcher...

    je vais essayer de faire quelque chose avec ça et je verrai bien, merci

  8. #8
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Merci beaucoup, ça marche à la perfection avec le contextclassloader

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

Discussions similaires

  1. Problème avec plusieurs requêtes sql
    Par Raul10 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/08/2007, 18h21
  2. Problème avec plusieurs clés etrangères
    Par rc-cheap dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/07/2007, 11h42
  3. Problème avec plusieurs panels
    Par GTJuanpablo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/04/2007, 18h38
  4. Réponses: 2
    Dernier message: 02/06/2006, 23h16
  5. [XP Pro]Problème avec plusieurs profils utilisateurs sur PC
    Par marsup54 dans le forum Windows XP
    Réponses: 8
    Dernier message: 27/04/2005, 09h32

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