我创建了一个具有以下结构的项目:
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();
}
}
在行
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
我有错误
初始 SessionFactory 创建 failed.org.hibernate.HibernateException: C:\Users\Nikolay_Tkachev\workspace\hiberTest\src\logic\hibernate.cfg.xml 在线程“main”中未找到异常 java.lang.ExceptionInInitializerError 位于 logic.HibernateUtil.buildSessionFactory(HibernateUtil.java:19) 在 逻辑.HibernateUtil.(HibernateUtil.java:9) 在 logic.Main.main(Main.java:12) 原因: org.hibernate.HibernateException: C:\Users\Nikolay_Tkachev\workspace\hiberTest\src\logic\hibernate.cfg.xml 未找到于 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) 在logic.HibernateUtil.buildSessionFactory(HibernateUtil.java:14) ...还有2个
错误原因是什么以及如何修复?
给出与您的项目相关的路径。
在您的
resources
中创建一个名为 src
的文件夹,并将配置文件放在那里。
configuration.configure("/resources/hibernate.cfg.xml");
如果你检查你的代码
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
return new Configuration().configure().buildSessionFactory();
在两行中您将创建两个配置对象。
如果你写的话,应该可以工作(尚未测试),
Configuration configuration = new Configuration().configure( "C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml");
return configuration.buildSessionFactory();
但是在服务器上部署后失败,因为您使用的是系统路径而不是项目相对路径。
不知怎的,放在“src”文件夹下对我来说不起作用。
而是将 cfg.xml 放置如下:
[Project Folder]\src\main\resources\hibernate.cfg.xml
有效。 使用此代码
new Configuration().configure().buildSessionFactory().openSession();
在
下的文件中 [Project Folder]/src/main/java/com/abc/xyz/filename.java
另外hibernate.cfg.xml中有这段代码
<mapping resource="hibernate/Address.hbm.xml" />
<mapping resource="hibernate/Person.hbm.xml" />
将上述 hbm.xml 文件放在:
编辑:
[Project Folder]/src/main/resources/hibernate/Address.hbm.xml
[Project Folder]/src/main/resources/hibernate/Person.hbm.xml
以上结构有效。
您可以将文件“hibernate.cfg.xml”放入src文件夹(src\hibernate.cfg.xml),然后按照以下代码初始化配置:
Configuration configuration = new Configuration();
sessionFactory =configuration.configure().buildSessionFactory();
这是自定义文件夹结构时的实际示例: 文件夹结构,并初始化类
HibernateUtil
与:
return new Configuration().configure("/config/hibernate.cfg.xml").buildSessionFactory();
带有自定义实体映射文件:
<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>
(注:最简单的方法,如果按照默认方式,则意味着将所有xml配置文件放在
src
文件夹中,在构建sessionFactory时,仅:
return new Configuration().configure().buildSessionFactory();
)
对于任何感兴趣的人:如果您正在使用Intellj,只需将
hibernate.cfg.xml
放在src/main/resources
下即可。
尝试下面的代码它将解决您的问题。
Configuration configuration = new Configuration().configure("/logic/hibernate.cfg.xml");
我的问题是我的资源文件夹中有一个排除模式。 删除后
config.configure();
为我工作。随着结构 src/java/...src/resources 下的 HibernateUtil.java 和 cfg 文件。
发生此异常的另一个原因是,如果您对
Configuration
或 AnnotatedConfiguration
对象调用两次配置方法,如下所示 -
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");
顺便说一句,这个项目结构在 eclipse 内部。
使用两次configure()方法是我的问题。而不是像这样使用:
Configuration configuration = new Configuration().configure();
configuration.configure("/main/resources/hibernate.cfg.xml");
现在我这样使用,问题就不存在了。
Configuration configuration = new Configuration();
configuration.configure("/main/resources/hibernate.cfg.xml");
P.S:我的 hibernate.cfg.xml 文件也位于“src/main/resources/hibernate.cfg.xml”。 亲爱的代码对我有用。在休眠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;
}
}
如果是 Maven 项目,请在 src/main 文件夹下创建一个名为 resources 的文件夹,并将该 resources 文件夹添加为类路径中的源文件夹。
您可以通过转到“配置构建路径”,然后单击“将文件夹添加到源选项卡”来完成此操作。
然后检查资源文件夹并单击应用。
然后只需使用:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
专门针对 VS 代码 正如其他人已经回答了这个问题,但如果上述解决方案不适合您,那么您想添加一件常见的事情,方法是在 IDE 中移动 hibernate.cfg.xml 文件,然后您可以显示您的资源管理器并手动将此文件放在正确的地方。
#vscode