【问题标题】:where does ...hbm.xml file go?...hbm.xml 文件在哪里?
【发布时间】:2013-01-18 09:30:51
【问题描述】:

我是一个 Hibernate 新手,正在尝试一个带有嵌入式 Derby 数据库的小型 hibernate 示例。我正在eclipse中开发。我没有使用 Spring 或 Maven,我没有设置 Web 应用程序,我没有应用程序服务器。如果项目变得更大,我无疑会使用其中的一些,但现在我只是想让这个例子工作。

我得到的错误是:

Exception in thread "main" org.hibernate.MappingNotFoundException: resource: javabeat/net/hibernate/EmployeeInfo.hbm.xml not found

有时只是:

Exception in thread "main" org.hibernate.MappingNotFoundException: resource: EmployeeInfo.hbm.xml not found

这是我的代码;我已经标记了错误似乎来自哪里 - eclipse 控制台在那里显示异常并停止运行,这是合乎逻辑的地方:

package javabeat.net.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class JavaBeatHibernateExample
{
  public static void main(String args[]) throws Exception
  {

    configureDerbyEmbedded();

    Configuration cfg = new Configuration();
    cfg.addClass(javabeat.net.hibernate.EmployeeInfo.class);

    cfg.setProperty("hibernate.connection.driver_class", "org.apache.derby.jdbc.EmbeddedDriver");
    cfg.setProperty("hibernate.connection.password", "password");
    cfg.setProperty("hibernate.connection.url", "jdbc:derby:myEmbeddedDB;create=true");
    cfg.setProperty("hibernate.connection.username", "admin");
    cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.DerbyDialect");
    cfg.setProperty("cache.provider_class", "org.hibernate.cache.NoCacheProvider");

    // Exception almost certainly generated here.
    cfg.addResource("EmployeeInfo.hbm.xml");

    cfg.setProperty("hibernate.current_session_context_class", "thread");
    cfg.setProperty("hibernate.show_sql", "true");
    SessionFactory sessionFactory = cfg.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    transaction.begin();
    EmployeeInfo employeeInfo = new EmployeeInfo();
    employeeInfo.setSno(1);
    employeeInfo.setName("KamalHasan");
    session.save(employeeInfo);
    transaction.commit();
    session.close();
  }

  private static void configureDerbyEmbedded() 
      throws ClassNotFoundException, IllegalAccessException, InstantiationException
  {
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
  }
}

我在eclipse中的文件夹设置如下

CarRepair
--src
----javabeat
------net
--------hibernate
----main
------resources
--------javabeat
----------net
------------hibernate

我有一个 EmployeeInfo.hbm.xml,我把它放在以下地方: src/javabeat/net/hibernate 主/资源/javabeat/net/hibernate 主要/资源

而且我总是遇到上述异常。首先,它只是说找不到 XML 文件;在后两者中,它会在错误消息中的 XML 文件名前面添加 javabeat/net/hibernate。

文件应该在其他地方,还是我应该做的其他事情?

编辑:它可能是 xml 文件本身中的某些内容,带有误导性错误消息吗?

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
        <class name="javabeat.net.hibernate.EmployeeInfo" table="Employee_Info">
            <id name="sno" column="sno" type="java.lang.Integer">
            </id>
            <property name="name" column="name" type="java.lang.String"/>
        </class>
    </hibernate-mapping>

【问题讨论】:

  • eclipse 将东西从 src 复制到 bin,所以这实际上没有帮助。

标签: java hibernate hibernate-mapping


【解决方案1】:

你有一个非常特殊的目录布局。假设 src 是 Eclipse 中的源文件夹,它会将所有非 Java 文件复制到 classes 或 bin 目录(或您为编译的类选择的任何目录名称),EmployeeInfo.hbm.xml 应该直接在 @987654323 下@,因为你告诉 Hibernate 从类路径的根目录加载它:

cfg.addResource("EmployeeInfo.hbm.xml");

如果你把它放在main/resources中,加载它的代码应该是

cfg.addResource("main/resources/EmployeeInfo.hbm.xml");

为什么不使用自己的包层次结构,并因此使用以下目录树:

src
  com
    rcook
      myapp

【讨论】:

  • 不,在 src 下也不起作用。我仍然在异常消息中收到 javabeat/net/hibernate/EmployeeInfo.hbm.xml 错误。
  • 那是因为你的代码中还有cfg.addClass(javabeat.net.hibernate.EmployeeInfo.class)。这要求 Hibernate 在包javabeat.net.hibernate 中加载文件EmployeeInfo.hbm.xml。选择您希望如何加载文件,使用addClass()addResource(),但不能同时使用两者。
  • 好的,现在明白我不应该从两个地方加载类,但这并不能纠正这个错误,它明确表示它无法找到 xml 文件。尽管我必须更改 addResource 语句,但我已经找到了使其工作的方法。看我的回答。
  • 我很抱歉——如果我仔细记得告诉 eclipse 清理和重建,它确实在 src 中工作。如果我更改 addResource 语句,我可以从 src 以原来的方式加载,也可以从包位置加载。
【解决方案2】:

正如您所说,您没有使用 maven,src/main/resources 就像 Eclipse 项目的任何其他文件夹一样。因此只需复制 src 文件夹下的 hbm 文件并删除“addClass”方法。

【讨论】:

  • 由于某种原因,将 XML 放入 src 文件夹并不能解决问题。我找到了一种使它工作的方法,尽管我必须更改上面的 addResource 方法,是的,我也必须删除 addClass。我要写一个答案。谢谢。
  • 我很抱歉,将它放入 src 确实有效——这次我更加确定我已经清理并重建了,我一定是上次错过了。谢谢 - 我将较早的答案标记为已接受,因为他是第一个......
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 2019-04-10
  • 2022-01-16
  • 2011-09-11
  • 2017-09-04
  • 2019-09-24
  • 2014-04-02
  • 1970-01-01
相关资源
最近更新 更多