Как загрузить hibernate.cfg.xml из другого места

Я создаю банку, использующую спящий режим. Я столкнулся с ситуацией, когда мне нужно часто менять параметр (url), поэтому я хотел бы загрузить hibernate.cfg.xml, как этот

SessionFactory sessionFactory = new Configuration()
                                     .configure("D:\\fax\\hibernate.cfg.xml")
                                     .buildSessionFactory();

Но после запуска проекта я получаю это исключение

org.hibernate.HibernateException: D:\fax\hibernate.cfg.xml not found
    at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:147)
    at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1287)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1309)
    at hibernate.LabOrderHelper.getDatabaseSesssion(LabOrderHelper.java:55)
    at hibernate.Test.main(Test.java:42)

Как загрузить hibernate.cfg.xml из другого места, кроме пути к классу?

Ответ 1

В классе Configuration

существует метод public Configuration configure(File configFile)

Попробуйте следующее: оно должно работать точно:)

File f = new File("D:\\fax\\hibernate.cfg.xml");
SessionFactory sessionFactory = new Configuration().configure(f).buildSessionFactory();

Разница заключается в том, что вы использовали метод configure(String resource), который ожидает ресурс в пути к классам, но где configure(File configFile) ожидает File, поэтому вы можете передать его.

Ответ 2

Файл конфигурации Hibernate XML "hibernate.cfg.xml" всегда помещается в корень вашего пути к классу проекта вне любого пакета. Если вы поместите этот файл конфигурации в другой каталог, может возникнуть следующая ошибка:

Initial SessionFactory creation failed.org.hibernate.HibernateException: 
/hibernate.cfg.xml not found

Чтобы запросить Hibernate посмотреть ваш файл "hibernate.cfg.xml" в другом каталоге, вы можете изменить класс Hibernates SessionFactory по умолчанию, передав путь к файлу "hibernate.cfg.xml" в качестве аргумента в метод configure()

SessionFactory sessionFactory = new Configuration()
            .configure("/com/example/persistence/hibernate.cfg.xml")
            .buildSessionFactory();

            return sessionFactory;

Полный пример в HibernateUtil.java для загрузки "hibernate.cfg.xml" из каталога "/com/example/persistence/".

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // load from different directory
            SessionFactory sessionFactory = new Configuration().configure(
                    "/com/example/persistence/hibernate.cfg.xml")
                    .buildSessionFactory();

            return sessionFactory;

        } 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();
    }

}

Ответ 3

дополняя принятый ответ, Вы можете загрузить hibernate.cfg.xml из другого каталога (не обязательно путь к классам), используя метод configure (File configFile), который принимает аргумент файла hibernateConfig. (обратите внимание, я использую спящий режим 4.3.7)

Преимущество состоит в том, что если у вас нет доступа к военному файлу, но вы можете получить доступ к файлу спящего режима в другом каталоге, скажем, для обслуживания.

Вот так:


String hibernatePropsFilePath = "/etc/configs/hibernate.cfg.xml";
File hibernatePropsFile = new File(hibernatePropsFilePath);

Configuration configuration = new Configuration(); 
configuration.configure(hibernatePropsFile);

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

ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

Ответ 4

Мне нужно часто менять настройку sql (url)

У меня было такое же требование. Для переключения только свойств соединения с БД подход, предложенный в принятом ответе, хотя и работает, является немного тупым инструментом.

Загрузка полностью другого файла конфигурации, чтобы изменить несколько свойств соединения? Теперь все другие свойства, которые являются общими в обоих, дублируются, и каждый раз, когда вы делаете изменения, вам нужно сделать это в двух местах.

Лучший способ состоит в том, чтобы поместить все общие свойства, которые не должны меняться между средами по умолчанию hibernate.cfg.xml, постройте свой Configuration из этого как обычно, и используйте .addProperties(), чтобы добавить свойства, специфичные для среды, сверху, в этом случае URL-адрес соединения. Вы можете загрузить эти дополнительные свойства из любого места, которое вам нравится.

public SessionFactory buildSessionFactory() {
   return getConfiguration().buildSessionFactory();
}

private Configuration getConfiguration() {
   Configuration config = new Configuration.configure(); // load the base config from the default hibernate.cfg.xml
   return config.addProperties(getConnectionProperties()); // add your custom connection props for this environment on top
}

private Properties getConnectionProperties() {
  Properties connectionProps = new Properties();
  connectionProps.put("hibernate.connection.url", getConnectionUrl()); 
  // possibly add other props like hibernate.connection.username, hibernate.connection.password
  return connectionProps;
}

private String getConnectionUrl() {
  // get your connection URL from wherever you like
}