我是一名Hibernate新手,尝试使用嵌入式Derby数据库的小型hibernate示例。我在日食中发展。我没有使用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 /网/休眠 主/资源/ javabeat /网/休眠 主/资源
我总是得到上述异常。首先,它只是说它找不到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>
答案 0 :(得分:2)
您有一个特殊的目录布局。假设src
是Eclipse中的源文件夹,它会将所有非Java文件复制到classes或bin目录(或者您为编译类选择的任何目录名),并且EmployeeInfo.hbm.xml
应该是直接在src
下,因为你告诉Hibernate从类路径的根目录加载它:
cfg.addResource("EmployeeInfo.hbm.xml");
如果将它放在main / resources中,加载它的代码应为
cfg.addResource("main/resources/EmployeeInfo.hbm.xml");
为什么不使用自己的包层次结构,因此使用以下目录树:
src
com
rcook
myapp
答案 1 :(得分:1)
正如您所说,您没有使用maven,src / main / resources就像Eclipse项目的任何其他文件夹一样。因此,只需复制src文件夹下的hbm文件并删除&#34; addClass&#34;方法