3

データベースと通信するための永続層としてHibernateを使用しています。mavenプラグインhbm2javaを使用して、dao、java、* hbm.xml、およびhibernate.cfg.xmlを生成しました。その時まで、プラグインは正常に機能します。

しかし、dbと通信しようとすると、次の例外が発生します。

Aug 30, 2012 1:45:46 PM org.hbm2dao.AssemblyHome getSessionFactory
SEVERE: Could not locate SessionFactory in JNDI
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:     java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.hbm2dao.AssemblyHome.getSessionFactory(AssemblyHome.java:29)
at org.hbm2dao.AssemblyHome.<init>(AssemblyHome.java:24)
at com.myhadoop.app.App.main(App.java:22)
java.lang.IllegalStateException: Could not locate SessionFactory in JNDI
at org.hbm2dao.AssemblyHome.getSessionFactory(AssemblyHome.java:33)
at org.hbm2dao.AssemblyHome.<init>(AssemblyHome.java:24)
at com.myhadoop.app.App.main(App.java:22)
Exception in thread "main" java.lang.NullPointerException
at com.myhadoop.app.App.main(App.java:32)

デフォルトでは、hibernate3:hbm2cfgxmlは、sessionFactory名がSessionFactoryであるhibernate.cfg.xmlファイルを生成します。次のように。

<session-factory name="SessionFactory">

プラグインは、セッションファクトリを取得するために次のコードを生成します。

private final SessionFactory sessionFactory = getSessionFactory();

protected SessionFactory getSessionFactory() {
    try {

        return (SessionFactory) new InitialContext().lookup("SessionFactory");
    }
    catch (Exception e) {
        log.error("Could not locate SessionFactory in JNDI", e);
        throw new IllegalStateException("Could not locate SessionFactory in JNDI");
    }
}

EclipseHibernateプラグインを使用した同様のクエリの問題が見つかりました-JNDIでsessionfactoryを見つけることができませんでした。

ただし、プラグインによって生成された400以上のクラスを変更して、*Home.javaからセッションファクトリを取得することはできません。

400以上のクラスを変更せずに、休止状態のプラグインでこの問題を取り除く方法は?

Web/アプリサーバーを使用したくありません。これはスタンドアロンアプリケーションです。

4

1 に答える 1

1

その生成されたメソッドの使用は、ファイルを見つけることができるgetSessionFactory()ように環境を設定した場合にのみ機能し、それができないように聞こえます。InitialContexthibernate.cfg.xml

javadocsInitialContextに従って環境を正しく設定することにより、この問題を修正できます。別の方法として、メソッドを変更して単純にを作成し、マッピングファイルの場所を指定することで、JNDIを完全に切り取ることができます。InitialContextgetSessionFactoryConfiguration

于 2013-03-25T19:44:35.717 に答える