Java Hibernate可以读取Hibernate.cfg.xml的内容,但仍然会给出错误?

Java Hibernate可以读取Hibernate.cfg.xml的内容,但仍然会给出错误?,java,hibernate,Java,Hibernate,我知道这是个老生常谈的问题,但它确实困住了我 我接受GetInputsReal的建议,使用classLoader,代码如下: public static Session getSession() { if (sessionFactory == null) { InputStream xmlInputStream = ResourceUtil.getInputStream(HibernateDBUtil.class, CFG_XML);

我知道这是个老生常谈的问题,但它确实困住了我

我接受GetInputsReal的建议,使用classLoader,代码如下:

 public static Session getSession() {
    if (sessionFactory == null) {
        InputStream xmlInputStream = 
                ResourceUtil.getInputStream(HibernateDBUtil.class, CFG_XML);
        Scanner scanner = new Scanner(xmlInputStream);
        //just a test I can read the xml file ,print content here
        while(scanner.hasNext()) System.out.println(scanner.nextLine());
        scanner.close();
        //reget the stream
        xmlInputStream = 
                ResourceUtil.getInputStream(HibernateDBUtil.class, CFG_XML);
        Configuration cfg = new Configuration();
        cfg.addInputStream(xmlInputStream).configure();
        // version 4.3 's way to config
        StandardServiceRegistryBuilder builder = 
                new StandardServiceRegistryBuilder().applySettings
                (cfg.getProperties());  
        StandardServiceRegistryImpl registry = 
                (StandardServiceRegistryImpl) builder.build();  

        sessionFactory = cfg.buildSessionFactory(registry);  
    }
    return sessionFactory.openSession();
}
private static SessionFactory sessionFactory;
private static final String CFG_XML = "properties/hibernate.cfg.xml"; 
我确认ResourceUtil.getInputStream工作正常,因为我可以打印hibernate.cfg.xml的内容,但为什么仍然给我错误:

更新: 完整堆栈跟踪:

信息:hh000412:Hibernate核心{4.3.0.Final} 2014年1月10日晚上11:33:43 org.hibernate.cfg.Environment

信息:hh000206:hibernate.properties未找到2014年1月10日11:33:43 PM org.hibernate.cfg.Environment buildBytecodeProvider

信息:HH000021:字节码提供商名称:javassist 2014年1月10日 11:33:44 PM org.hibernate.cfg.Configuration配置信息:hh000043: 从资源配置:/hibernate.cfg.xml 2014年1月10日晚上11:33:44 org.hibernate.cfg.Configuration getConfigurationInputStream

信息:hh000040:配置资源:/hibernate.cfg.xml异常 在线程“main”org.hibernate.HibernateException:/hibernate.cfg.xml中 找不到 org.hibernate.internal.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:173)atorg.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:2093) 位于org.hibernate.cfg.Configuration.configure(Configuration.java:2074) 位于org.hibernate.cfg.Configuration.configure(Configuration.java:2054) 在 cn.edu.gdut.utils.HibernateDBUtil.getSession(HibernateDBUtil.java:49) 在 cn.edu.gdut.utils.HibernateDBUtil.listBasicElement(HibernateDBUtil.java:25) 位于cn.edu.gdut.utils.HibernateDBUtil.main(HibernateDBUtil.java:20)


我认为,文件在IDE中的位置并不重要。重要的是在执行期间文件将在最终捆绑包中的何处

因此,假设您的
properties/
文件夹应该成为已执行捆绑包的根目录。这样,由于hibernate.cfg.xml位于
properties/
中,因此在执行期间它应该位于根目录中。你能试着用这个吗

私有静态最终字符串CFG_XML=“hibernate.CFG.XML”

已更新

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

下面是您的代码。在
hibernate.cfg.xml
中,我提到了

请提供完整的堆栈跟踪。谢谢,请参阅完整堆栈。我尝试使堆栈文本看起来更好,但失败了,希望不要让您感到不安。hibernate似乎无法找到您的hibernate.cfg.xml。尝试创建一个以CFG_XML作为路径参数的文件,并检查getAbsolutePath()方法将指向何处。也许你有一个错误的根目录?谢谢。很抱歉我的回复太晚了。事实上,在上面的代码中,我可以得到xmlInputstream内容(请参阅scanner,我可以读取它的内容),这意味着没有什么问题。我使用类加载器在ResourceUtil类中加载资源,它与其他部分配合得很好,比如图标和属性文件。但是Hibernate就是找不到xmlInputStream,为什么?谢谢。我以前试过,但没有用。也许,我需要更仔细地阅读官方文档寻求帮助。@xiaowang根据我的知识
addInputStream()
Configuration
类的
用于从InputStream读取映射,而不是读取hibernate配置文件。您必须使用
setProperty()
设置hibernate的不同属性,如
hibernate.dial
等,或者使用
SettingsFactory
传递cfg文件。我同意更新。如果您要使用
cfg.xml
文件,则必须使用上述代码。否则,您可以使用
setProperty()
要从代码设置hibernate配置并使用
addInputStream()
将hbm inputStream传递到
配置
谢谢,我阅读了[questions/8830357]并阅读了源代码,理解它。我的结论是不要混合配置文件hibernate.cfg.xml和xxx.hbm.xml映射文件。我们最好在使用hibernate时让javadoc工作,否则会造成麻烦。是的,根据部署情况,最好使用
hibernate.cfg.xml
,因为如果您通过代码完成了hibernate的所有配置,并且在部署之后您想要更改hibernate的一些设置,那么您必须重新部署/Hotdeploy“.class”文件…我认为这比只编辑xml文件要好。。