我使用hibernate作为持久层来与数据库通信。我使用maven插件hbm2java生成dao、java、*hbm.xml和hibernate.cfg.xml。在那之前,插件运行良好。
但当我试图与数据库通信时,它给出了以下异常。

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生成hibernate.cfg.xml文件,会话工厂名为session factory。就像下面一样。
<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");
    }
}

我发现了类似的查询Problems using eclipse Hibernate plugin - could not locate sessionfactory in JNDI
但是,改变插件生成的400多个类以从*home.java获取会话工厂是不可行的。
如何在不改变400+类的情况下解决hibernate插件的这个问题?
我不想使用任何web/app服务器这是我的独立应用程序。

最佳答案

使用生成的getSessionFactory()方法只有在设置了环境以便InitialContext可以找到hibernate.cfg.xml文件时才能工作,而且听起来好像找不到。
您可以通过按照InitialContext javadocs正确设置InitialContext和您的环境来解决该问题。另一种方法是,您可以通过将getSessionFactory方法更改为只创建一个Configuration,并告诉它映射文件的位置来完全删除jndi。

09-26 21:36
查看更多