org.hibernate.MappingNotFoundException: resource: com/corp/d



不,这与这个问题、这个问题或这个问题不是同一个问题。

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

此外,它曾经运行良好,只要我静态地(即在构建时硬编码)从hibernate.cfg.xml中获取所有内容,在我的 HibernateUtil 中使用这个简单的静态方法.java:

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"):

static {
  try {
    sessionFactory = buildHibernateConfig().buildSessionFactory();
  } catch (Throwable ex) {
    System.out.println("Initial SessionFactory creation failed: " + ex.getMessage());
    throw new ExceptionInInitializerError(ex);
  }
}

private static Configuration buildHibernateConfig() throws FileNotFoundException, IOException {
  Properties properties = new Properties();
  sConfig = new Configuration().configure("resources/hibernate.cfg.xml");
  try {
    properties.load(ServiceUtils.class.getResourceAsStream(MYWS_PROPS));
  } 
  catch (IOException e) {
    LOG.severe("Cannot find properties file " + MYWS_PROPS);
    throw new SecurityException("Server Error: couldn't open " + MYWS_PROPS + " file");
  }
  /*hardcoded*/sConfig.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");/*hardcoded*/
  /*hardcoded*/sConfig.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");/*hardcoded*/
  sConfig.setProperty("hibernate.connection.url", properties.getProperty("dburl"));
  // Add Hibernate XML mappings
  sConfig.addClass(FooTbl.class);
  return sConfig;
}

我收到运行时异常:

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)

现在。。。在异常之前,日志显示找到文件。我还验证了这些文件是否实际包含在 WAR 文件中,与预期完全相同的子目录中。那么,为什么会出现此错误?

解决此问题的推荐方法是什么?

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

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

所以更换

sConfig.addClass(FooTbl.class);

sConfig.addResource("com/corp/dept/proj/FooTbl.hbm.xml");

希望这能解决您的问题。

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

与其采用静态初始化块路由,不如坚持使用原始的静态 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);
  }
}

无需扩展Configuration类和...就像一个魅力。:)

请确保

你的文件FooTbl.hbm.xml名称应该与addClass()方法的类名匹配。

在这里,您的类名是 FooTbl,那么映射文件名应该是 FooTbl.hbm.xml否则将生成异常。

试试这个。:)

相关内容

最新更新