简体   繁体   中英

Hibernate can't read hibernate.cfg.xml

I'm using Hibernate 4.1 in GWT app running on Jetty 1.6 Got the next code to start up 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);

First line gives me an error:

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

But I checked hibernate.cfg.xml availability just before loading hib.config:

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

Sysout returns true.

Looking into source of ConfigHelper.getResourceAsStream with break point in it:

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

I'm doing something wrong (doesn't understand something) or it's really no xml loaders here?

There are several things wrong here.

First of all, this:

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

does not do what you think it does.

Your example is not checking the availability of the configuration file. It is checking whether the file exists on the file system, not in the classpath. This difference is important.

Without knowing more about how you build and deploy your webapp or how you have your files organized, it's hard to give you any more concrete advice, other than try copying the "hibernate.cfg.xml" to the root of your classpath, and just passing that to the configure() method. That should work.

So your code should be:

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

And your hibernate.cfg.xml file should be in the root of your classpath.

Alternatively, if you're using Maven, just put it under the "resources" folder and Maven should do the rest for you.

I'll tell you that program won't never treat you. about your problem, you can do like this to get the path of the config file:

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

then read it

InputStream in = new FileInputStream(basePath + fileName);

Good luck!

This way custom-located config file is loaded:

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

FYC: configure() method are overloaded

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM