我使用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生成会话工厂名称为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");
}
}
我在使用eclipse Hibernate插件时发现了类似的查询问题-无法在JNDI中找到sessionfactory。
然而,改变插件生成的400+个类以从*Home.java.获得会话工厂是不可行的
如何在不更改400+类的情况下使用hibernate插件来解决这个问题?
我不想使用任何网络/应用程序服务器,这是我的独立应用程序。
只有当您设置了环境,使得InitialContext
可以找到您的hibernate.cfg.xml
文件时,才可以使用生成的getSessionFactory()
方法,但听起来它不能。
您可以通过按照InitialContext
javadocs正确设置InitialContext
和环境来解决这个问题。作为替代方案,您可以通过更改getSessionFactory
方法来完全剪切JNDI,只需创建一个Configuration
,并告诉它映射文件在哪里。