4

私は 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/net/hibernate main/resources/javabeat/net/hibernate main/resources

そして、私は常に上記の例外を受け取ります。最初の例では、XML ファイルが見つからないというだけです。後者の 2 つは、エラー メッセージの XML ファイル名の前に javabeat/net/hibernate を付加します。

ファイルは別の場所にあるはずですか、それとも他にやるべきことがありますか?

EDIT:誤解を招くエラーメッセージで、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>
4

2 に答える 2

2

非常に特殊なディレクトリ レイアウトがあります。が Eclipse のソース フォルダーであると仮定するsrcと、Java 以外のすべてのファイルがクラスまたは bin ディレクトリ (またはコンパイルされたクラス用に選択したディレクトリ名) にコピーされEmployeeInfo.hbm.xmlますsrc。クラスパスのルートからロードします。

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

main/resources に配置する場合、それをロードするコードは次のようになります。

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

独自のパッケージ階層を使用しないでください。したがって、次のディレクトリ ツリーを使用してください。

src
  com
    rcook
      myapp
于 2013-02-03T15:27:34.927 に答える
1

あなたがmavenを使用していないと言ったように、src/main/resourcesはEclipseプロジェクトの他のフォルダーと同じです。したがって、src フォルダーの下に hbm ファイルをコピーし、「addClass」メソッドを削除するだけです。

于 2013-02-03T15:41:23.363 に答える