Problème de lecture hibernate.cfg.xml à cause dtd

Problème de lecture hibernate.cfg.xml à cause dtd - Java - Programmation

Marsh Posté le 23-11-2004 à 10:49:48    

Bonjour,
 
J'utilise Hibernate v2.1 pour faire du O/R mapping. J'ai un souci tout bête que tout le monde a déjà dû rencontré sur un projet lié au fait que le fichier de configuration hibernate.cfg.xml est validé par rapport à une DTD nommé hibernate-mapping-2.0.dtd.
 
Mon problème, c'est que lorsque j'exécute le code suivant
 

Code :
  1. SessionFactory sessionFactory = new Configuration().configure().buildSessionfactory();


 
La méthode configure() appelée sans paramètre recherche le fichier nommé hibernate.cfg.xml, qu'elle trouve chez moi dans le répertoire des classes. Or ce fichier XML référence la DTD citée plus haut, laquelle est située dans le même répertoire. A la place la JVM me sort une FileNotFoundException avec un chemin style C:\IBM\WSAD\hibernate-mapping-2.0.dtd alors que le chemin de la DTD est C:\IBM\WSAD\Workspace\monAppli\classes\hibernate-mapping-2.0.dtd.
 
Mon problème, c'est que la DTD est référencée de manière relative dans l'en-tête du fichier hibernate.cfg.xml mais que le répertoire de base qui sert à calculer l'URL absolue de la DTD n'est pas le répertoire des classes mais plutôt le répertoire considéré comme le "home" de la JVM.
 
J'ai ce problème en local pour mes tests donc j'imagine que je l'aurai aussi lors des phases de déploiement sur différentes serveurs.
 
Y'a-t-il un moyen propre (une best practice) pour résoudre ce problème à part mettre un chemin en dur dans l'en-tête du fichier hibernate.cfg.xml (Ce qui est quand même dégueulasse) ?  
 
En espérant avoir été clair :)
 
Merci d'avance. Je ne suis pas constamment sur le forum car obligé d'utiliser un poste en libre-service (arf)

Reply

Marsh Posté le 23-11-2004 à 10:49:48   

Reply

Marsh Posté le 23-11-2004 à 13:25:14    

bah tu references ta dvd correctement dans ton xml
et "le répertoire de base qui sert à calculer l'URL absolue de la DTD", c'est celui d'ou est lancé ton appli.
tu peux peut etre aussi passer par le classpath, on bien referencer l'url de la dtd (http://www.hibernate.org/....), en esperant pour toi que le contenu en soit caché en local :p

Reply

Marsh Posté le 23-11-2004 à 19:00:31    

Citation :

bah tu references ta dvd correctement dans ton xml


 
Quelle est la manière correcte de référencer la DTD dans mon fichier XML ?
 
Actuellement, j'ai cela:
 

Code :
  1. <!DOCTYPE hibernate-configuration PUBLIC
  2.         "-//Hibernate/Hibernate Configuration DTD 2.0//EN"
  3.  "hibernate-configuration-2.0.dtd">


 
Avec le XML et la DTD dans le même répertoire. Ca me semble correct.
 

Citation :


et "le répertoire de base qui sert à calculer l'URL absolue de la DTD", c'est celui d'ou est lancé ton appli.


 
C'est plus ou moins ce que j'avais compris...
 

Citation :


tu peux peut etre aussi passer par le classpath, on bien referencer l'url de la dtd (http://www.hibernate.org/....), en esperant pour toi que le contenu en soit caché en local :p


 
Oui, je vais tenter de la placer dans un répertoire du classpath

Reply

Marsh Posté le 03-01-2005 à 16:13:26    

Bon,
 
je reuppe car j'avais trouvé une solution de contournement qui ne marche pas lorsque je déploie mon application.  
 
Si j'ai bien compris (suite à mes recherches sur le net), référencer correctement la DTD c'est la référencer par une URL du style "http://hibernate.sourceforce.net/hibernate-configuration-2.0.dtd" au lieu de "hibernate-configuration-2.0.dtd" tout seul.
 
Mon problème, c'est que le réseau sur lequel sera déployé l'application ne sera pas connecté à internet. Comment dois-je faire dans ce cas à part coller le fichier "en dur" dans l'arborescence de WAS là où WAS le cherche ?
 
Merci d'avance

Reply

Marsh Posté le 03-01-2005 à 16:22:20    

je suis pas sur, mais si tu mets SYSTEM a la place de PUBLIC, il se peut qu'il cherche dans le rep courant ou dans le classpath; et la dtd est probablement dans le jar d'hibernate


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-01-2005 à 16:29:44    

super, je teste ça... :jap:

Reply

Marsh Posté le 03-01-2005 à 16:32:45    

(cela dit, c'est pas du tout lié a hibernate, mais a la librairie xml utilisée en dessous)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-01-2005 à 16:50:07    

La DTD est bien dans le JAR d'Hibernate. Mais ça ne marche pas actuellement. Je teste...
 
Je tente de voir la différence avec ce que j'ai pour Log4J pour lequel le parsing du log4j.xml est bien effectué via la DTD du (semble-t-il) log4j.jar.
 
C'est frustrant ce truc car je bidouille maiu je n'ai pas vraiment d'idée de ce que je fais, je n'aurai rien appris si je réussis à faire marcher mon parsing de hibernate.cfg.xml

Reply

Marsh Posté le 03-01-2005 à 16:50:46    

et si tu googlais un coup?
a coup sur c'est dans la doc, la faq ou un blog quelconque


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-01-2005 à 16:55:02    

donc je dois comprendre comment fonctionne la librairy xml utilisée par hibernate pour comprendre mon bug... :/

Reply

Marsh Posté le 03-01-2005 à 16:55:02   

Reply

Marsh Posté le 03-01-2005 à 16:56:40    

j'ai déjà googler mais je n'ai pas trouvé de sujet proche. Je ne dois pas rechercher avec les bons mots-clés...

Reply

Marsh Posté le 03-01-2005 à 17:20:24    

ça marche pas en mettant SYSTEM au lieu de PUBLIC? normalement quand tu met SYSTEM tu peux specifier un path complet vers la dtd, sur le file system... mais il me semble l'avoir déjà vu marcher sur des dtd qui étaient dans le classpath...
OU tu t'arranges pour desactiver la validation [:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-01-2005 à 17:22:42    

Reply

Marsh Posté le 03-01-2005 à 17:46:28    

Citation :

This means that your XML parser does not support the EntityResolver


ca existe ça [:le kneu]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-01-2005 à 17:52:17    

vieux xerces peut etre ? [:spamafote]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-01-2005 à 20:16:21    

Et mettre la dtd dans le répertoire de contenu statique de ton appli, t'as  essayé ?
 
./web/images
./web/html
./web/css
./web/dtd
 
ça me parait trop simple, y a kekechose qui m'échappe ?

Reply

Marsh Posté le 04-01-2005 à 07:19:47    


 
Merci. Par défaut Hibernate utilise Dom4J qui semble poser problème comme tu disais. Je vais tenter d'utiliser Xerces à la place...

Reply

Marsh Posté le 04-01-2005 à 10:05:32    

Les recherches sur le net montrent clairement que la faute revient à Dom4J.
 
Les astuces données sur cette page (Mettre SYSTEM au lieu de PUBLIC et utiliser Xerces à la place de Dom4J) ne marchent pas.
 
La 1ère astuce ne change absolument rien à moins qu'il y ait un endroit spécial du serveur WebSphere où je dois placer mes DTDs afin qu'elles soient trouvées correctement dans le cas d'un DOCTYPE SYSTEM ???  
 
Pour cette 2nde astuce, j'ai tenté de parser le fichier hibernate.xfg.xml "manuellement" avec Xerces puis de le passer en paramètre de sessionFactory.configure(org.w3c.Document document) au lieu d'appeler sessionFactory.configure(String filename). Ca marche mais l'erreur se déporte ensuite aux fichiers de mappings *.hbm.xml car le fichier hibernate.cfg.xml comporte des chemins vers les fichiers de mapping xml qui sont parsés par Dom4J et rebelote, il me recherche les DTDs au mauvais endroit... :/
 
J'arrive pas à comprendre...


Message édité par machinbidule1974 le 04-01-2005 à 10:10:11
Reply

Marsh Posté le 04-01-2005 à 10:11:17    

krosso a écrit :

Et mettre la dtd dans le répertoire de contenu statique de ton appli, t'as  essayé ?
 
./web/images
./web/html
./web/css
./web/dtd
 
ça me parait trop simple, y a kekechose qui m'échappe ?


 
J'y crois pas trop, la DTD doit être recherchée dans le classpath. Le parser SAX n'a aucune idée de l'existence de ces répertoires.

Reply

Marsh Posté le 04-01-2005 à 15:55:53    

machinbidule1974 a écrit :

J'y crois pas trop, la DTD doit être recherchée dans le classpath. Le parser SAX n'a aucune idée de l'existence de ces répertoires.


Mettre dans le fichier hibernate là où c'est bien  
http://url_de_ton_appli/dtd/machin.dtd
pourquoi çe ne marcherait pas ?
 
Dans mes applis je vais carrément le chercher là :
http://hibernate.sourceforge.net/h [...] on-2.0.dtd
donc je ne comprends pas pourquoi çe ne fonctionnerait pas en "local".
Ceci dit j'utilise tomcat et j'ai la flemme de faire le test   :sleep:


Message édité par krosso le 04-01-2005 à 15:57:13
Reply

Marsh Posté le 05-01-2005 à 15:42:17    

J'avais pensé à mettre une url locale comme tu conseilles mais le problème, c'est que mon fichier XML va contenir  une url en dur alors que le déploiement de l'EAR peut se faire sous n'importe quelle root URI.
 
J'en avais marre de me prendre la tête alors je l'ai mis là où Dom4J cherchait la DTD, à la racine du répertoire de WebSphere. Je sais que c'est dégueulasse mais la solution correcte semble être d'utiliser Xerces au lieu du parser intégré à Dom4J en utilisant JAXP et en positionnant des variables d'environnements pour indiquer quel parser instancier. Comme j'y connais rien ç JAXP et que ça commence à me gaver...
 
Merci de votre aide à tous

Reply

Marsh Posté le 27-04-2005 à 11:04:24    

Bonjour,
 
je débute sous hibernate. j'utilise eclipse comme editeur. Et j'ai un petit souci pour le fichier de mapping file.
j'ai une base oracle.
j'utilise le driver oracle.jdbc.driver.OracleDriver
mon URL : jdbc: Oracle: Oci:@/localhost:9999:VPMD_VPMWFRCD
j'entre bien mon nom d'utilisateur et mon mot de passe.
 
Lorsque je clik sur refresh la barre de chargement se met en route. Une fois qu'elle est terminé aucunes erreur s'est produites mais rien ne s'est affiché dans mes tables? :(  
cela vient peut etre de mon URL... :??:  

Reply

Marsh Posté le 27-04-2005 à 18:57:48    

J'ai rien compris à ton problème. Ouvre plutôt un topic à toi en détaillant mieux

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed