J'ai créé un projet avec la structure suivante:
HibernateUtil:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
}
}
à la ligne
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
J'ai une erreur
Création initiale de SessionFactory failed.org.hibernate.HibernateException: C:\Utilisateurs\Nikolay_Tkachev\espace de travail\hiberTest\src\logic\hibernate.cfg.xml not found Exception dans le fil "main" Java.lang.ExceptionInInitializerError à logic.HibernateUtil.buildSessionFactory (HibernateUtil.Java:19) à logic.HibernateUtil. (HibernateUtil.Java:9) à logic.Main.main (Main.Java:12) Causé par: org.hibernate.HibernateException: C:\Utilisateurs\Nikolay_Tkachev\espace de travail\hiberTest\src\logic\hibernate.cfg.xml introuvable à org.hibernate.internal.util.ConfigHelper.getResourceAsStream (ConfigHelper.Java:173) à org.hibernate.cfg.Configuration.getConfigurationInputStream (Configuration.Java:1947) à org.hibernate.cfg.Configuration.configure (Configuration.Java:1928) at logic.HibernateUtil.buildSessionFactory (HibernateUtil.Java:14) ... 2 plus
Quelle est la raison de l'erreur et comment puis-je la réparer?
Donnez le chemin relatif à votre projet.
Créez un dossier appelé resources
dans votre src
et placez-y votre fichier de configuration.
configuration.configure("/resources/hibernate.cfg.xml");
Et si vous vérifiez votre code
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
return new Configuration().configure().buildSessionFactory();
Sur deux lignes, vous créez deux objets de configuration.
Cela devrait fonctionner (non testé) si vous écrivez,
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
return configuration.buildSessionFactory();
Mais il échoue après le déploiement sur le serveur, puisque vous utilisez un chemin système plutôt qu'un chemin relatif au projet.
De toute façon, placer sous le dossier "src" ne fonctionnait pas pour moi.
Au lieu de placer cfg.xml comme ci-dessous:
[Project Folder]\src\main\resources\hibernate.cfg.xml
travaillé . Utiliser ce code
new Configuration().configure().buildSessionFactory().openSession();
dans un fichier sous
[Project Folder]/src/main/Java/com/abc/xyz/filename.Java
De plus, vous avez ce morceau de code dans hibernate.cfg.xml
<mapping resource="hibernate/Address.hbm.xml" />
<mapping resource="hibernate/Person.hbm.xml" />
Placez les fichiers hbm.xml ci-dessus sous:
MODIFIER:
[Project Folder]/src/main/resources/hibernate/Address.hbm.xml
[Project Folder]/src/main/resources/hibernate/Person.hbm.xml
Au-dessus de la structure a travaillé.
Vous pouvez placer le fichier "hibernate.cfg.xml" dans le dossier src (src\hibernate.cfg.xml), puis initialiser la configuration sous le code ci-dessous:
Configuration configuration = new Configuration();
sessionFactory =configuration.configure().buildSessionFactory();
Ceci est un exemple de réalité lorsque vous personnalisez la structure de dossiers: Structure de dossiers et initialisez la classe HibernateUtil
avec:
return new Configuration().configure("/config/hibernate.cfg.xml").buildSessionFactory();
avec personnaliser les fichiers de mappage des entités:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping class="com.vy.entities.Users"/>
<mapping class="com.vy.entities.Post"/>
<mapping resource="config/Users.hbm.xml"/>
<mapping resource="config/Post.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(Remarque: la manière la plus simple, si vous suivez la méthode par défaut, cela signifie de placer tous les fichiers de configuration xml dans le dossier src
, lors de la construction de la sessionFactory, uniquement:
return new Configuration().configure().buildSessionFactory();
)
essayez ci-dessous le code cela résoudra votre problème.
Configuration configuration = new Configuration().configure("/logic/hibernate.cfg.xml");
Mon problème était que j’avais un motif excessif dans le dossier des ressources ..
config.configure();
a travaillé pour moi. Avec la structure Src/Java/... HibernateUtil.Java et le fichier cfg sous src/resources.
Une autre raison pour laquelle cette exception se produit est si vous appelez la méthode configure deux fois sur un objet Configuration
ou AnnotatedConfiguration
comme ceci
AnnotationConfiguration config = new AnnotationConfiguration();
config.addAnnotatedClass(MyClass.class);
//Use this if config files are in src folder
config.configure();
//Use this if config files are in a subfolder of src, such as "resources"
config.configure("/resources/hibernate.cfg.xml");
En fait, cette structure de projet est à l'intérieur d'Eclipse.
Dans le cas d'un projet Maven, créez un dossier nommé resources dans le dossier src/main et ajoutez le dossier resources en tant que dossier source dans votre chemin de classe.
Vous pouvez le faire en allant dans Configurer le chemin de construction, puis en cliquant sur Ajouter un dossier à l'onglet Sources.
Ensuite, vérifiez le dossier des ressources et cliquez sur Appliquer.
Ensuite, utilisez simplement:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Utiliser la méthode configure () deux fois est responsable du problème pour moi. Au lieu d'utiliser comme ceci:
Configuration configuration = new Configuration().configure();
configuration.configure("/main/resources/hibernate.cfg.xml");
Maintenant, j'utilise comme ça, le problème n'existe plus.
Configuration configuration = new Configuration();
configuration.configure("/main/resources/hibernate.cfg.xml");
P.S: Mon fichier hibernate.cfg.xml se trouve également dans "src/main/resources/hibernate.cfg.xml". Le code ci-dessous fonctionne pour moi. à hibernate-5
public class HibernateUtil {
private static SessionFactory sessionFactory ;
static {
try{
Configuration configuration = new Configuration();
configuration.configure("/main/resources/hibernate.cfg.xml");
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
}
catch(Exception e){
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Pour ceux que cela intéresse: si vous utilisez Intellij , il suffit de mettre hibernate.cfg.xml
sous src/main/resources
.