Hibernate无法读取hibernate.cfg.xml

时间:2013-04-02 10:35:09

标签: java hibernate

我在Jetty 1.6上运行的GWT应用程序中使用Hibernate 4.1 得到了下一个启动hib.instance的代码:

Configuration configuration = new Configuration().configure(ABS_PATH_TO_CONFIG+File.separator+"hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);

第一行给出了一个错误:

org.hibernate.HibernateException: ...hibernate.cfg.xml not found
at org.hibernate.internal.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:173)

但是我在加载hib.config之前检查了hibernate.cfg.xml可用性:

File conf = new File(ABS_PATH_TO_CONFIG+File.separator+"hibernate.cfg.xml");
System.out.println(conf.canRead());

Sysout返回true。

查看包含断点的ConfigHelper.getResourceAsStream来源:

InputStream stream = null;
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader!=null) {
    stream = classLoader.getResourceAsStream( stripped );
}
if ( stream == null ) {
    stream = Environment.class.getResourceAsStream( resource );
}
if ( stream == null ) {
    stream = Environment.class.getClassLoader().getResourceAsStream( stripped );
}
if ( stream == null ) {
    throw new HibernateException( resource + " not found" );
}

我做错了什么(不明白的东西)或者这里真的没有xml加载器?

3 个答案:

答案 0 :(得分:3)

这里有几个问题。

首先,这个:

Configuration configuration = new Configuration().configure(ABS_PATH_TO_CONFIG+File.separator+"hibernate.cfg.xml");

不符合你的想法。

您的示例不检查配置文件的可用性。它检查文件是否存在于文件系统上,而不是在类路径中。这种差异很重要。

在不了解更多关于如何构建和部署Web应用程序或如何组织文件的情况下,除了尝试将“hibernate.cfg.xml”复制到类路径的根目录之外,很难再给出更具体的建议,并将其传递给configure()方法。这应该有用。

所以你的代码应该是:

Configuration configuration = new Configuration().configure("hibernate.cfg.xml");

您的hibernate.cfg.xml文件应位于类路径的根目录中。

或者,如果您正在使用Maven,只需将其放在“resources”文件夹下,Maven就应该为您完成剩下的工作。

答案 1 :(得分:1)

我会告诉你,程序永远不会对你不好。 关于你的问题,你可以这样做以获得配置文件的路径:

String basePath = PropertiesUtil.class.getResource("/").getPath();

然后阅读

InputStream in = new FileInputStream(basePath + fileName);
祝你好运!

答案 2 :(得分:1)

这样就加载了定制配置文件:

File conf = new File(ABS_PATH_TO_CONFIG+File.separator+"hibernate.cfg.xml");
Configuration configuration = new Configuration().configure(conf.getAbsoluteFile());

FYC:configure()方法过载