Получение статуса HTTP 500 — org.hibernate.internal.util.config.ConfigurationException: указанный файл cfg.xml не существует

Я работаю над проектом, используя Java, Spring MVC и Hibernate (моя IDE — IntelliJ). Когда я пытаюсь получить доступ к URL-адресу (который делает простой вызов моей базы данных Oracle через Hibernate) на моем локальном хосте после развертывания в Tomcat, я получаю следующую ошибку:

Состояние HTTP 500 — Ошибка обработки запроса; вложенным исключением является org.hibernate.internal.util.config.ConfigurationException: указанный файл cfg.xml [C:\apache-tomcat-7.0.52\bin\src\main\resources\hibernate.cfg.xml] не существует

Мой вопрос: почему моя программа ищет в моей папке apache-tomcat? Я никогда не указывал в своем коде, что нужно искать в этой папке, и все мои тесты проходят успешно, когда дело доходит до использования Hibernate.

Подходы, предпринятые на данный момент для решения проблемы:

  1. Пытался восстановить мой файл WAR с нуля
  2. Выполнение очистки maven, компиляция, установка, а затем повторное развертывание в Tomcat
  3. org.hibernate.internal.util.config.ConfigurationException: Не удалось найти ресурс cfg.xml [/HibernateTest/src/hibernate.cfg.xml]
  4. http://www.mkyong.com/hibernate/how-to-load-hibernate-cfg-xml-from-other-directory/
  5. Расположение файла hibernate.cfg.xml в проекте?

Ни один из перечисленных выше подходов не сработал для меня. Я предоставил свой код ниже вместе с моей файловой структурой, чтобы помочь:


Мой метод SessionFactory:

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(Request.class);

    StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());

    ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    return sessionFactory;
}

Приложение.java

@RestController
@RequestMapping("/ourApp")
public class Application {

    @RequestMapping(value = "/getRequestResponse", method = RequestMethod.GET, headers = "Accept=application/json")
    @ResponseBody
    public String returnRequestResponse() {
        RequestService requestService = new RequestService();
        Request request = requestService.findById(1);
        Gson gson = new Gson();
        return gson.toJson(request);
    }
}

Структура файла:

введите здесь описание изображения


Обновлять

Это работает, если я помещаю файл конфигурации Hibernate в папку Tomcat.

Мои тесты теперь терпят неудачу, когда я пытался реализовать решение shankarsh15 в своем методе SessionFactory. Вот моя функция setUp перед запуском моих тестов:

@Before
public void setUp() throws Exception {

    Configuration configuration = new Configuration();
    configuration.addAnnotatedClass(MyService.class)
            .addAnnotatedClass(MyModel.class);
    configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
    configuration.setProperty("hibernate.connection.driver_class", "oracle.jdbc.OracleDriver");
    configuration.setProperty("hibernate.connection.url", "jdbc:oracle:thin:@//servername.mycompany.com:12345/abcdefg");
    configuration.setProperty("hibernate.connection.username", "username");
    configuration.setProperty("hibernate.connection.password", "password");

    sessionFactory = configuration.buildSessionFactory();
    session = sessionFactory.openSession();
}

Обновлен hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:oracle:thin:@//servername.mycompany.com:12345/abcdefg</property>
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="connection.username">username</property>
        <property name="connection.password">password</property>
        <property name="show_sql">true</property>
        <mapping class="com.mycompany.project.modelName.model.MyModelClass"/>
    </session-factory>
</hibernate-configuration>

person abhi    schedule 13.05.2016    source источник


Ответы (3)


Вместо прямого указания файла hibernate.cfg.xml перепишите свой код следующим образом:

Configuration configuration = new Configuration().configure();
ServiceRegistryBuilder registry = new ServiceRegistryBuilder();
registry.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = registry.buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();

Просто убедитесь, что hibernate.cfg.xml находится в корне пути classpath, что в вашем случае верно, так как он находится в разделе src/main/resources< /сильный>.

person shankarsh15    schedule 14.05.2016
comment
ServiceRegistryBuilder устарел. В настоящее время я использую Hibernate 5.1.0. Есть ли альтернативы этому? - person abhi; 18.05.2016
comment
Пожалуйста, попробуйте: Конфигурация конфигурации = новая конфигурация(); конфигурация.настроить(); ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); SessionFactory sf = configuration.buildSessionFactory(sr); - person shankarsh15; 18.05.2016
comment
Спасибо, но теперь, когда я получаю исключение org.hibernate.UnknownEntityTypeException: невозможно найти сохранятеля: я подозреваю, что это мой setUp() в наборе тестов JUnit. Я разместил код и обновленный файл конфигурации выше. - person abhi; 18.05.2016

Вы пытались указать полный путь к файлу конфигурации? или попробуйте без указания src, например. main/resources/.... и почему он ищет в вашей папке tomcat, а не в исходном коде?

person Yadab    schedule 14.05.2016
comment
Да сделал, все равно не работает. Мой вопрос такой же, как тот, который вы задаете; почему он ищет в моей папке Tomcat вместо поиска в моем исходном коде? :) - person abhi; 18.05.2016

Я не должен был вручную проверять файл конфигурации гибернации. Вместо этого мой метод getSessionFactory() должен был выглядеть следующим образом:

private static SessionFactory getSessionFactory() {
        Configuration configuration = new Configuration().configure();
        configuration.addAnnotatedClass(MyClassNameHere.class);
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        return configuration.buildSessionFactory(builder.build());
    }
person abhi    schedule 23.08.2016