2013-11-19 4 views
10

Я создаю банку, используя спящий режим. Я сталкивался с ситуацией, когда мне нужно изменить параметр (URL) часто, так что я хотел бы загрузить hibernate.cfg.xml как этотКак загрузить 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 из другого места, кроме пути к классу?

+0

Возможный дубликат http://stackoverflow.com/questions/9108082/place-hibernate-configuration-in-a-different-location. – Jayasagar

ответ

20

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

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

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

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

+0

Отлично, очень рад за вас :). Может принять его, чтобы он помог другим найти правильный ответ :) – Jayasagar

1

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

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

Чтобы задать Hibernate искать файл «hibernate.cfg.xml» в другом каталоге, вы можете изменить библиотеки Hibernate SessionFactory по умолчанию класс, передавая свой «hibernate.cfg.xml» путь к файлу в качестве аргумента в Configure() метод:

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

      return sessionFactory; 

Полный пример в HibernateUtil.java, чтобы загрузить «hibernate.cfg.xml» из каталога «/ ком/пример/сохранение/«.

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

} 
1

дополняющий принятый ответ, Вы можете загрузить hibernate.cfg.xml из другой директории (не обязательно CLASSPATH), используя Configure (File CONFIGFILE) метод, который принимает аргумент файла hibernateConfig. (примечание, использую hibernate 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); 

0

мне нужно изменить настройки 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 
} 
Смежные вопросы