如何从不同位置加载 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