How to load hibernate.cfg.xml from different location How to load hibernate.cfg.xml from different location xml xml

How to load hibernate.cfg.xml from different location


There is a method public Configuration configure(File configFile) in class Configuration

Try the following, it should work for sure :)

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

The difference is you have used a method configure(String resource) which is expecting a resource in a classpath, but where as configure(File configFile) is expecting a File, so you can pass it.


I need to change the sql setting(url) often

I had the same requirement. For switching just the DB connection properties the approach suggested in the accepted answer, though it works, is a bit of a blunt instrument.

Loading a completely different configuration file just to change a few connection properties? Now all the other properties that are common in both are duplicated, and every time you make a change you need to make it in two places.

A better way is to put all the common properties that don't need to change between environments in the default hibernate.cfg.xml, build your Configuration from that as usual, and use the .addProperties() method to add the properties that are environment-specific on top, in this case the connection url. You can load these extra properties from anywhere you like.

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}


Hibernate XML configuration file “hibernate.cfg.xml” is always put at the root of your project classpath, outside of any package. If you place this configuration file into a different directory, you may encounter the following error :

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

To ask Hibernate look for your “hibernate.cfg.xml” file in other directory, you can modify the default Hibernate’s SessionFactory class by passing your “hibernate.cfg.xml” file path as an argument into the configure() method:

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

Full Example in HibernateUtil.java, to load “hibernate.cfg.xml” from directory “/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();    }}