如何从不同的位置加载hibernate.cfg.xml

时间:2013-11-19 04:39:44

标签: java xml hibernate

我正在使用hibernate创建一个jar。我遇到过需要经常更改设置(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

4 个答案:

答案 0 :(得分: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)期望类路径中的资源,但configure(File configFile)期望File的位置,因此您可以传递它。

答案 1 :(得分:2)

  

我需要经常更改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
}

答案 2 :(得分:1)

Hibernate XML配置文件“hibernate.cfg.xml”始终放在项目类路径的根目录中,位于任何包之外。如果将此配置文件放在其他目录中,则可能会遇到以下错误:

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

要让Hibernate在其他目录中查找“hibernate.cfg.xml”文件,可以通过将“hibernate.cfg.xml”文件路径作为参数传递给configure()方法来修改默认的Hibernate的SessionFactory类。 :

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

            return sessionFactory;

HibernateUtil.java中的完整示例,从目录“/ com / example / persistence /".

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

}

答案 3 :(得分:1)

补充接受的答案, 您可以使用带有hibernateConfig File参数的configure(File configFile)方法从其他目录(不一定是类路径)加载hibernate.cfg.xml。 (注意,我正在使用hibernate 4.3.7)

优点是,如果您无法访问war文件,但可以访问其他目录中的hibernate文件,例如维护。

像这样:


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