2

我在 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)

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

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

Sysout 返回真。

查看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 加载器?

4

3 回答 3

3

这里有几件事是错误的。

首先,这个:

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

不做你认为它做的事。

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

如果不了解更多关于如何构建和部署 webapp 或如何组织文件的信息,很难给你任何更具体的建议,除了尝试将“hibernate.cfg.xml”复制到类路径的根目录,然后将其传递给 configure() 方法。那应该行得通。

所以你的代码应该是:

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

而且您的 hibernate.cfg.xml 文件应该在您的类路径的根目录中。

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

于 2013-04-02T11:47:24.863 回答
1

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

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

然后阅读

InputStream in = new FileInputStream(basePath + fileName);

祝你好运!

于 2013-04-02T11:04:12.447 回答
1

这种方式自定义定位的配置文件被加载:

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

FYC:configure()方法重载

于 2013-04-02T13:28:01.730 回答