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

Posted

技术标签:

【中文标题】如何从不同位置加载 hibernate.cfg.xml【英文标题】:How to load hibernate.cfg.xml from different location 【发布时间】:2013-12-02 12:29:51 【问题描述】:

我正在使用休眠创建一个 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

【问题讨论】:

***.com/questions/9108082/… 可能重复。 【参考方案1】:

我需要经常更改 sql 设置(url)

我也有同样的要求。对于仅切换数据库连接属性,接受的答案中建议的方法虽然有效,但有点生硬。

加载一个完全不同的配置文件只是为了改变一些连接属性?现在,两者共有的所有其他属性都被复制了,每次进行更改时,都需要在两个地方进行更改。

更好的方法是将不需要在环境之间更改的所有通用属性放在默认的hibernate.cfg.xml 中,照常构建您的Configuration,然后使用@ 987654323@ 方法在顶部添加特定于环境的属性,在本例中为连接 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】:

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,因此您可以传递它。

【讨论】:

太好了,真为你高兴:)。可以接受它,以便它帮助其他人找到正确的答案:)【参考方案3】:

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

优点是,如果您无法访问 war 文件,但可以访问不同目录中的休眠文件,例如进行维护。

像这样:


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】:

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


【讨论】:

以上是关于如何从不同位置加载 hibernate.cfg.xml的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?

HibernateAccess to DialectResolutionInfo cannot be null when ‘hibernate.dialect‘ not set

HibernateAccess to DialectResolutionInfo cannot be null when ‘hibernate.dialect‘ not set

无法处理不同位置的数据

查找从哪里加载 java 类

如何根据用户的状态位置将用户重定向到不同的 index.php 页面