在哪里放置hibernate.cfg.xml文件?

52

我的项目是这样的:

/src/main/java
     -thegamers
         -app.java
         -hibernateutil.java

有人能告诉我应该把hibernate.cfg.xml文件放在哪里吗?

因为我遇到了这个错误:

Initial SessionFactory creation failed.org.hibernate.HibernateException: hibernate.cfg.xml not found
Exception in thread "main" java.lang.ExceptionInInitializerError
    at thegamers.HibernateUtil.buildSessionFactory(HibernateUtil.java:17)
    at thegamers.HibernateUtil.<clinit>(HibernateUtil.java:8)
    at thegamers.App.main(App.java:15)
Caused by: org.hibernate.HibernateException: hibernate.cfg.xml not found
    at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:170)
    at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:2149)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:2130)
    at thegamers.HibernateUtil.buildSessionFactory(HibernateUtil.java:13)
    ... 2 more

如果您即使将文件放置在“/src”下仍然遇到相同的错误,则需要检查输出文件夹以确保编译后位于WEB-INF/classes下。 - Elbek
1
/src 是源文件夹吗?有时 /src/main/class 可能会作为源文件夹,然后您可以将其放置在 /src/main/class 中。 - Elbek
这可能是一个愚蠢的问题,但像 org.hibernate.cfg.Configuration 这样的东西是如何被程序员称呼的?这是类 Configuration 的项目路径吗? - MrYouMath
9个回答

38

配置文件 hibernate.cfg.xml 需要在 classpath 上。

这可以通过不同的方式来实现,具体取决于你的项目。

  • 对于一个web 应用 WAR 项目(在 Servlet 容器中运行程序):将其放置在 WEB-INF/classes 中将会起作用,因为在容器中运行应用时,WEB-INF/classes 目录下的文件可以被类加载器找到。

  • 对于一个Maven 风格的项目(没有在 Servlet 容器中运行程序):将其放置在 /src/main/resources/ 目录下即可。

  • 否则,可以尝试将其放在 src/ 目录下。


我有一个ant文件,可以为我构建一个jar文件,我可以部署它并且它可以正常工作。但是,如果我尝试加载new Configuration().configure("file:hibernate.cfg.xml");,无论我将hibernate.cfg.xml放在哪个目录下,它都会失败。如果我通过URLClassLoader打印出类路径,我会得到/opt/novell/teaming/apache-tomcat/bin/bootstrap.jar,它位于服务器机器上。 - StellaMaris
@StellaMaris,你尝试过 new Configuration().configure("file:/opt/novell/teaming/apache-tomcat/path/to/hibernate.cfg.xml") 吗?当文件被部署或运行时,你需要知道它的位置才能以这种方式访问它。 - Don Cheadle

17

我正在使用maven,直到我将hibernate.cfg.xml放在src/main/resources中才能正常运行。


12

在你的项目根目录下:/src(至少默认情况下)

如何知道/src是源目录?
当你创建一个新的Java类时,它会被包含在一个包中(通常使用与创建它的目录同名的名称)。因此,在您的类声明中,您可以看到类似于以下内容:

package foo;

class MyClass{

在默认的IDE设置中,该类应该被找到在/src/foo/MyClass.java下。正如你所看到的,在这种情况下,/src充当根源目录。


/src 是您的源代码项目目录吗?我建议您进行“重建”项目。集成开发环境可以帮助您完成此任务。 - manix
如果/src是我的项目目录,我该如何知道呢? - Noor
1
在Eclipse中,我创建了一个源文件夹,并把所有的配置文件放到其中,现在它可以工作了。 - Noor
1
@Noor,如果你没有太多涉及这些工具的经验,那么IDE至少可以帮助你解决这类问题,因为它们可以重构、重新组织和清除几个项目配置 :) - manix

4
如果不是Web项目,则需要明确地这样做。
new Configuration().configure( "pth/to/hibernate.cfg.xml").buildsessionfactory()

希望这可以帮到您。

@SiB提供了一个链接(mkyong的网站),在那里有很好的解释。


如果我的 hibernate.cfg.xml 文件位于 /Hibernate/src/kasun/hibernate/testing/hibernate.cfg.xml,其中 Hibernate 是项目名称,kasun.hibernate.testing 是包名。我该如何在上述代码中指定 hibernate.cfg.xml 文件? - Kasun Siyambalapitiya

2
该文件应该放在您的根目录下的 /src 文件夹中,而 /src 不会被部署,其中的所有内容都将被构建/复制到部署的 WEB-INF/classes 中。Hibernate 需要在项目的 classpath 中的 cfg.xml 文件来加载其配置设置,您的 WEB-INF 目录不在 classpath 中,所以如果您把它放在那里,您就会将其从 Hibernate 中“隐藏”,这样它就无法工作。
线程将告诉您如何从任何不同路径加载 hibernate.cfg.xml。

当WAR文件被部署/解压时,WEB-INF/classes和WEB-INF/lib将在类路径上。 - Don Cheadle

1
hibernate.cfg.xml 文件放置在 src/ 文件夹下,或者在代码中明确指定路径:
new Configuration.configure("path of hibernate.cfg.xml").buildsessionfactory()

1
如果您正在使用Eclipse,可以前往项目 -> 属性 -> Java构建路径 -> 源代码。您可以添加新文件夹并将文件放入其中,或将文件移动到现有文件夹中。

0
当你在Eclips上按CMD+N/CTR+N,它会打开一个对话框,然后你需要双击Hibernate文件夹。 这将打开一个带有XML扩展名的文件列表。 选择cfg.xml并单击“继续”,完成后点击“完成”。Eclips现在将添加类名称到cfg.xml文件中,并在SRC文件夹下显示它。

-1
尝试将其放置在“src/main/resources”目录中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接