Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.hibernate.MappingNotFoundException:resource:com/corp/dept/proj/football.hbm.xml未找到_Java_Xml_Hibernate - Fatal编程技术网

Java org.hibernate.MappingNotFoundException:resource:com/corp/dept/proj/football.hbm.xml未找到

Java org.hibernate.MappingNotFoundException:resource:com/corp/dept/proj/football.hbm.xml未找到,java,xml,hibernate,Java,Xml,Hibernate,不,这和or不是同一个问题 原因很简单,我的*.hbm.xml文件已经在正确的目录中(src/main/resources/com/corp/dept/proj) 此外,只要我在HibernateUtil.java中使用这个简单的静态方法,从hibernate.cfg.xml,静态地(即在构建时硬编码),它就可以正常运行: private static SessionFactory buildSessionFactory() { try { return new Conf

不,这和or不是同一个问题

原因很简单,我的*.hbm.xml文件已经在正确的目录中(
src/main/resources/com/corp/dept/proj

此外,只要我在HibernateUtil.java中使用这个简单的静态方法,从
hibernate.cfg.xml
,静态地(即在构建时硬编码),它就可以正常运行:

private static SessionFactory buildSessionFactory() {
    try {
        return new Configuration().configure("resources/hibernate.cfg.xml").buildSessionFactory();
    }
    catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
} 
但是,由于我想将一些参数从
hibernate.cfg.xml
移动到一个属性文件,以便在运行时读取(例如,DB的“connection.url”):

我收到一个运行时异常:

Apr 03, 2014 14:31:49 AM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
Apr 03, 2014 14:31:49 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.6.Final}
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: resources/hibernate.cfg.xml
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: resources/hibernate.cfg.xml
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: resources/com/corp/dept/proj/FooTbl.hbm.xml

Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Configuration addClass
INFO: HHH000221: Reading mappings from resource: com/corp/dept/proj/FooTbl.hbm.xml
Apr 03, 2014 14:31:49 AM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: com/corp/dept/proj/FooTbl.hbm.xml
Initial SessionFactory creation failed: resource: com/corp/dept/proj/FooTbl.hbm.xml not found

Caused by: org.hibernate.MappingNotFoundException: resource: com/corp/dept/proj/FooTbl.hbm.xml not found
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:712)
        at org.hibernate.cfg.Configuration.addClass(Configuration.java:757)
        at com.corp.dept.proj.myws.HibernateUtil.buildHibernateConfig(HibernateUtil.java:141)
        at com.corp.dept.proj.myws.HibernateUtil.<clinit>(HibernateUtil.java:56)
2014年4月3日14:31:49 AM org.hibernate.annotations.common.Version
信息:HCANN000001:Hibernate Commons注释{4.0.2.Final}
2014年4月3日14:31:49 AM org.hibernate.Version日志版本
信息:hh000412:Hibernate核心{4.2.6.Final}
2014年4月3日14:31:49 AM org.hibernate.cfg.Environment
信息:HH000206:找不到hibernate.properties
2014年4月3日14:31:49 AM org.hibernate.cfg.Environment buildBytecodeProvider
信息:HH000021:字节码提供程序名称:javassist
2014年4月3日14:31:49 AM org.hibernate.cfg.Configuration
信息:HH000043:从资源配置:resources/hibernate.cfg.xml
2014年4月3日14:31:49 AM org.hibernate.cfg.Configuration getConfigurationInputStream
信息:hh000040:配置资源:resources/hibernate.cfg.xml
2014年4月3日14:31:49 AM org.hibernate.cfg.Configuration addResource
信息:HH000221:正在从资源读取映射:resources/com/corp/dept/proj/footbal.hbm.xml
2014年4月3日14:31:49 AM org.hibernate.cfg.Configuration doConfigure
信息:HH000041:配置的会话工厂:null
2014年4月3日14:31:49 AM org.hibernate.cfg.Configuration addClass
信息:hh000221:正在从以下资源读取映射:com/corp/dept/proj/footbal.hbm.xml
2014年4月3日14:31:49 AM org.hibernate.cfg.Configuration addResource
信息:hh000221:正在从以下资源读取映射:com/corp/dept/proj/footbal.hbm.xml
初始会话工厂创建失败:未找到资源:com/corp/dept/proj/footbal.hbm.xml
原因:org.hibernate.MappingNotFoundException:resource:com/corp/dept/proj/footbal.hbm.xml未找到
位于org.hibernate.cfg.Configuration.addResource(Configuration.java:712)
位于org.hibernate.cfg.Configuration.addClass(Configuration.java:757)
位于com.corp.dept.proj.myws.HibernateUtil.buildHibernateConfig(HibernateUtil.java:141)
在com.corp.dept.proj.myws.HibernateUtil.(HibernateUtil.java:56)
现在。。。在异常发生之前,日志显示已找到文件。我还验证了这些文件是否实际包含在WAR文件中,与预期的子目录完全相同。那么,为什么这是一个错误


修复此问题的建议方法是什么?

获取配置(sConfig)实例后,您试图错误地添加XML映射文档。由于您使用的是基于XML的映射文件(.hbm),因此要添加XML映射文件,您需要使用addResource()方法,而不是addClass()方法

addClass()方法,用于添加基于注释的映射。

因此,替换

sConfig.addClass(FooTbl.class);


希望这能解决您的问题。

我找到了正确的解决方案:

不要走静态初始化块路线,只需坚持原来的静态buildSessionFactory()方法,并在
Configuration.configure()
Configuration.buildSessionFactory()之间插入
Configuration.setProperty()
语句(根据需要)。也就是说,与问题中发布的buildSessionFactory()的原始实现不同,我确实:

private static SessionFactory buildSessionFactory() {
  try {
    Configuration config = new Configuration();
    config = config.configure("resources/hibernate.cfg.xml");
    config.setProperty("hibernate.connection.url", properties.getProperty("dburl"));            
    SessionFactory session = config.buildSessionFactory();
    return session;
  }
  catch (Throwable ex) {
    System.err.println("Initial SessionFactory creation failed." + ex);
    throw new ExceptionInInitializerError(ex);
  }
}

无需扩展
配置
类和。。。工作起来很有魅力。:)

如果是addClass()方法,请确保文件FooTbl.hbm.xml名称应与类名匹配

这里的类名是footbal,然后映射文件名应该是footbal.hbm.xml,否则将生成异常


试试这个。:)

尝试一个测试并将footbal.hbm.xml复制到类文件夹中,这与您将.class文件定位到的位置相同。我注意到,在您的日志文件中,当它找到该文件时,它正在读取
resources/com/corp/dept/proj/footbal.hbm.xml
。如果没有,它正在尝试读取
com/corp/dept/proj/football.hbm.xml
。感谢这一提示。我试了你的建议,问题也一样。我还尝试了
“resources/com/corp/dept/proj/football.hbm.xml”
,结果出现了另一个问题。看起来我必须放弃静态初始化块方法,而不是保留原始实现,只是扩展
配置
类来覆盖从
hibernate.cfg.xml
读取的内容。如果这行得通,我会将此作为答案发布+小费1英镑。
sConfig.addClass(FooTbl.class);
sConfig.addResource("com/corp/dept/proj/FooTbl.hbm.xml");
private static SessionFactory buildSessionFactory() {
  try {
    Configuration config = new Configuration();
    config = config.configure("resources/hibernate.cfg.xml");
    config.setProperty("hibernate.connection.url", properties.getProperty("dburl"));            
    SessionFactory session = config.buildSessionFactory();
    return session;
  }
  catch (Throwable ex) {
    System.err.println("Initial SessionFactory creation failed." + ex);
    throw new ExceptionInInitializerError(ex);
  }
}