【问题标题】:Hibernate keeps looking for configuration file in a different locationHibernate 不断在不同的位置寻找配置文件
【发布时间】:2016-06-14 19:18:19
【问题描述】:

我使用 Eclipse IDE 构建了我的项目,并将我的 hibernate.cfg.xml 文件放在了 resources 文件夹中(下面的屏幕截图):


当我尝试在我的 DAO 类中引用 hibernate.cfg.xml 时,就会出现问题。这是我的代码的 sn-p,我在其中得到了我的 SessionFactory

DAO getSessionFactory() 示例

private static SessionFactory getSessionFactory() {
        String hibernatePropsFilePath = "src/main/resources/hibernate.cfg.xml";
        File hibernatePropsFile = new File(hibernatePropsFilePath);

        Configuration configuration = new Configuration();
        configuration.configure(hibernatePropsFile);
        configuration.addAnnotatedClass(MyClass.class);

        StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

        return configuration.buildSessionFactory(serviceRegistry);
    }

如您所见,我仍然指向项目中的“正确”位置,但是当我使用 Postman 进行测试时,出现以下错误:

HTTP 状态 500 - 请求处理失败;嵌套异常是 org.hibernate.internal.util.config.ConfigurationException:指定 cfg.xml 文件 [C:\Users\MYUSERNAME\Desktop\src\main\resources\hibernate.cfg.xml] 确实 不存在

我的问题为什么它总是在我的桌面中查找我的文件路径,我该如何将其更改为仅在我的项目中查找?我检查并制作了确保我的资源路径存在于我的 Web 部署程序集中(下面的屏幕截图):

【问题讨论】:

  • 你试过不指定路径吗?只需使用Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(). applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build());
  • @ChetanJadhavCD 这行得通,谢谢!奇怪为什么它现在可以工作(很久以前尝试过)

标签: java eclipse spring hibernate


【解决方案1】:

src/main 是 maven 特定的项目结构来安排源文件。但是编译后的类和资源文件都复制到WEB-INF/classes/目录下。

假设您使用的是maven,并且您的resources 文件夹是source 结构的一部分,那么XML 文件将被复制到WEB-INF/classes/resources 文件夹中。

将路径改为String hibernatePropsFilePath = "/resources/hibernate.cfg.xml";

更新:

再次查看您的Web Deployment Assembly 设置图像后,您的main/resources 文件夹映射到classes 目录而不是classes/resources。所以在不使用File的情况下更改代码如下所示。

    Configuration configuration = new Configuration("hibernate.cfg.xml");
    configuration.addAnnotatedClass(ClientCrossRef.class);` 
    configuration.configure();

更好的是,由于您的cfg.xml 文件已经是类路径的一部分,您甚至不需要指定它。 Hibernate 将在类路径中查找它。

顺便说一下,你可以很容易地构建会话工厂

SessionFactory sessionFactory = new Configuration().configure(
                    "hibernate.cfg.xml")
                    .buildSessionFactory();

【讨论】:

  • 试过了,现在我得到了:HTTP Status 500 - Request processing failed; nested exception is org.hibernate.internal.util.config.ConfigurationException: Specified cfg.xml file [C:\resources\hibernate.cfg.xml] does not exist。我注意到 File 类的默认目录是 C:\Users\MYUSERNAME\Desktop。会不会也是这个问题?
  • @TheApprentice 你不应该在 Web 应用程序中使用 java.io.File。 Hibernate Configure.configure() 方法也接受一个 URL。您可以致电getClass().getResource("hibernate.cfg.xml") 获取相应的网址。
  • 谢谢@markbernard 和K139。我感谢详细的答案和解释。已经对此进行了记录,并且我的应用程序正在按预期运行。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 2011-02-12
  • 2016-04-15
  • 2020-02-15
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多