2013-02-03 89 views
3

我是一名Hibernate新手,嘗試一個帶有嵌入式Derby數據庫的小型hibernate示例。我在日食中發展。我沒有使用Spring或Maven,我沒有設置Web應用程序,我沒有應用程序服務器。如果項目變大,我肯定會使用其中的一些,但現在我只是試圖讓這個例子起作用。哪裏有... hbm.xml文件去?

我得到的錯誤是:

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 

這裏是我的代碼;我已標記,其中的錯誤似乎來自何處 - 日食控制檯顯示異常出現,停止運行,並且它是合乎邏輯的地方:

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 /休眠 主/資源/ javabeat/NET /休眠 主/資源

我總是得到上述例外。首先,它只是說它找不到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

蝕副本從src複製到倉的事情,所以這實際上並沒有幫助。 – arcy

回答

2

你有一個相當特殊的目錄佈局。假設src是Eclipse的一個源文件夾,它會複製所有的非Java文件(不管目錄名,你選擇了編譯的類或)類或bin目錄,並EmployeeInfo.hbm.xml應該是直接src下,因爲你告訴Hibernate來從classpath的根目錄加載:

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

如果你把它放在主/資源,代碼加載它應該是

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

你爲什麼不使用自己的包層次結構,因此使用以下目錄樹:

src 
    com 
    rcook 
     myapp 
+0

不,在src下也不行。在異常消息中,我仍然收到javabeat/net/hibernate/EmployeeInfo.hbm.xml中的錯誤。 – arcy

+0

那是因爲你也是你的代碼有'cfg.addClass(javabeat.net.hibernate.EmployeeInfo.class)'。這要求Hibernate在包javajaat.net.hibernate中加載文件'EmployeeInfo.hbm.xml'。使用'addClass()'或'addResource()'選擇你想要加載文件的方式,但不能同時加載這兩種文件。 –

+0

好吧,現在明白我不應該從這兩個地方加載類,但是這不會糾正這個錯誤,它具體說它不能找到xml文件。我找到了一種使它工作的方法,但我必須更改addResource語句。看到我的答案。 – arcy

1

正如你說你不使用Maven,SRC /主/資源就像任何其他文件夾的Eclipse項目。因此,只需複製src文件夾下的hbm文件並刪除「addClass」方法即可。

+0

由於某種原因,將XML放入src文件夾中並不能解決問題。我找到了一種方法來實現它,儘管我必須改變上面的addResource方法,是的,我也必須刪除addClass。我要寫一個答案。謝謝。 – arcy

+0

我的歉意,它是否能夠把它放到src中 - 這次我特別確信我已經清理和重建,我最後一定錯過了。謝謝 - 我正在接受早先的答案,因爲他是第一個...... – arcy