3

我使用休眠作为持久层与数据库进行通信。我使用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 生成 hibernate.cfg.xml 文件,其会话工厂名称为 SessionFactory。就像下面一样。

<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");
    }
}

我使用 eclipse Hibernate 插件发现了类似的查询问题 - 无法在 JNDI 中找到 sessionfactory

但是,更改插件生成的 400 多个类以从 *Home.java 获取会话工厂是不可行的。

如何在不更改 400 多个类的情况下使用 hibernate 插件解决这个问题?

我不想使用任何网络/应用服务器,这是我的独立应用程序。

4

1 回答 1

1

getSessionFactory()仅当您设置了InitialContext可以找到文件的环境时,使用该生成的方法才有效hibernate.cfg.xml,而且听起来好像不能。

InitialContext您可以通过按照InitialContextjavadocs正确设置您的环境来解决该问题。作为替代方案,您可以通过将getSessionFactory方法更改为简单地创建 aConfiguration并告诉它映射文件在哪里来完全删除 JNDI。

于 2013-03-25T19:44:35.717 回答