论坛首页 Java企业应用论坛

『提问』在Tomcat中getSessionFactory使用JNDI查找SessionFa...

浏览 9376 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-08-29  
软件环境:
Hibernate 3.0.4
Tomcat 4.1.31

使用Hibernate Tool 生成的下列标准代码来获取 SessionFactory

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");
}
}
配置文件:
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<property name="hibernate.session_factory_name">
hibernate/SesionFactory</property>

<property name="hibernate.cglib.use_reflection_optimizer">true</property>
<property name="hibernate.connection.driver_class">
net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.connection.password">
password</property>
<property name="hibernate.connection.url">
jdbc:jtds:sqlserver://localhost/db</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect</property>
<mapping resource="com/elephi/simplegtd/model/GtdThings.hbm.xml"/>
<mapping resource="com/elephi/simplegtd/model/GtdMembers.hbm.xml"/>
</session-factory>
</hibernate-configuration>

错误提示信息:
10:46:55,968 ERROR GtdMembers:27 - Could not locate SessionFactory in JNDI
javax.naming.NameNotFoundException: Name SessionFactory is not bound in this Context
        at org.apache.naming.NamingContext.lookup(NamingContext.java:764)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:147)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)
        at javax.naming.InitialContext.lookup(InitialContext.java:347)
        at com.elephi.simplegtd.model.GtdMembersHome.getSessionFactory(GtdMembersHome.java:24)
        at com.elephi.simplegtd.model.GtdMembersHome.<init>(GtdMembersHome.java:19)
        at com.elephi.simplegtd.service.GtdMembersService.checkExist(GtdMembersService.java:15)
你的分析:
我看了许多讲解 SessionFactory 的文章。以及与 Tomcat 、配置 JNDI 有关的文章。包括论坛里面能搜索到的。但是还是不明白原因。

我的代码在通过 getSessionFactory 获取 SessionFactory 的时候,是通过查找 JNDI 的方式做的。(这是 Hibernate Tool 生成的 DAO 代码的一部分)。出现错误  Name SessionFactory is not bound in this Context 因此也就  Could not locate SessionFactory in JNDI 。

是否有以下原因?
1. Tomcat 4 和 Tomcat 5 在 JNDI 的处理方式上有区别,而 Hibernate Tool 生成的这个代码是针对 Tomcat 5 的?
2. 我的配置文件写得有问题?

如果不采用这种方式获取 SessionFactory 我还可以通过什么方法获取?

请同行们不吝赐教!
   发表时间:2005-08-29  
把配置文件中的 hibernate/SessionFactory 修改为 SessionFactory 即可。
这下子,getSessionFactory 可以执行下去了。不过 ...

org.hibernate.HibernateException: No TransactionManagerLookup specified
        at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:503)
        at com.elephi.simplegtd.model.GtdMembersHome.findByEmail(GtdMembersHome.java:114)
0 请登录后投票
   发表时间:2005-08-29  
1,用hibernate.session_factory即可
2,加上这个属性<property name="transaction.manager_lookup_class">xxx</property>试试
0 请登录后投票
   发表时间:2005-08-29  
KayMO 写道
1,用hibernate.session_factory即可
2,加上这个属性<property name="transaction.manager_lookup_class">xxx</property>试试

请问 xxx 用什么?
0 请登录后投票
   发表时间:2005-08-29  
org.hibernate.transaction.WeblogicTransactionManagerLookup这是weblogic的,tomcat的你去查查hibernate代码,我目前没有 sorry
0 请登录后投票
   发表时间:2005-08-29  
晕,在Hibernate API Doc中,居然只有以下:

BESTransactionManagerLookup,
JBossTransactionManagerLookup,
JRun4TransactionManagerLookup,
OrionTransactionManagerLookup,
ResinTransactionManagerLookup,
SunONETransactionManagerLookup,
WeblogicTransactionManagerLookup


没有 Tomcat 的 ~~ 晕

那么就用 net.sf.hibernate.transaction.JNDITransactionManagerLookup


还是不行。

org.hibernate.HibernateException: No TransactionManagerLookup specified
        at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:503)
        at com.elephi.simplegtd.model.GtdMembersHome.findByExample(GtdMembersHome.java:111)
        at com.elephi.simplegtd.service.GtdMembersService.checkExist(GtdMembersService.java:20)
0 请登录后投票
   发表时间:2005-09-04  
elephi 写道

如果不采用这种方式获取 SessionFactory 我还可以通过什么方法获取?
请同行们不吝赐教!


其实我个人认为使用JNDI来获取SessionFactory只是把创建这个重量级对象的任务放到其他地方去了,而不是你程序第一次访问数据库时进行创建的。以前我使用一个HibernateUtil类进行封装有关SessionFactory、Session对象等有关操作的类,当程序调用时,也仅仅是第一次创建是比较慢,创建好了,就快了。建议你看一下Hibernate官方编写的那个实例源码。里面有个HibernateUtil类。你参考一下。我实现JNDI好像没你那么复杂。我没有使用DAO,我觉得没有这个必要,虽然那样程序看起来会更清晰些。我编写了一个Servlet,他负责创建SessionFactory,并把他存储在InitialContext对象中去。此Servlet在Tomcat启动时,就执行。那么就把这个繁重的工作交给服务器初始化工作时去做吧。程序访问时就可以使用现成的了可以通过你设置的JNDI名字来进行此SessionFactory对象的访问了。
在HibernateUtil类中,我是这样去得到的:
/***************************************************************************
* 返回当前静态类使用的SessionFactory, 方法根据相应的SessionFactory 在上下文中绑定的 JNDI 名称来获得
*
* @return SessionFactory
*/
public static SessionFactory getSessionFactory() {
if (sessionFactory != null) {
return sessionFactory;
} else {
Context ctx = null;
/* 使用JNDI获取的静态变量的实例 */
try {
ctx = new InitialContext();
sessionFactory = (SessionFactory) ctx
.lookup(Constants.SESSION_FACTORY_JNDI);
} catch (NamingException ex) {
throw new InfrastructureException(ex);
} finally {
try {
ctx.close();
ctx = null;
} catch (NamingException e) {
e.printStackTrace();
}
}
return sessionFactory;
}
}

Constants.SESSION_FACTORY_JNDI 是一个常量字符串,就是你配置时的名字
另外配置时,我只配置了下面的,程序可以正常执行
<property name="hibernate.session_factory_name">hibernate</property>
仅供参考
0 请登录后投票
   发表时间:2005-09-05  
单身男人 写道
elephi 写道

如果不采用这种方式获取 SessionFactory 我还可以通过什么方法获取?
请同行们不吝赐教!


其实我个人认为使用JNDI来获取SessionFactory只是把创建这个重量级对象的任务放到其他地方去了,而不是你程序第一次访问数据库时进行创建的。以前我使用一个HibernateUtil类进行封装有关SessionFactory、Session对象等有关操作的类,当程序调用时,也仅仅是第一次创建是比较慢,创建好了,就快了。建议你看一下Hibernate官方编写的那个实例源码。里面有个HibernateUtil类。你参考一下。我实现JNDI好像没你那么复杂。我没有使用DAO,我觉得没有这个必要,虽然那样程序看起来会更清晰些。我编写了一个Servlet,他负责创建SessionFactory,并把他存储在InitialContext对象中去。此Servlet在Tomcat启动时,就执行。那么就把这个繁重的工作交给服务器初始化工作时去做吧。程序访问时就可以使用现成的了可以通过你设置的JNDI名字来进行此SessionFactory对象的访问了。
在HibernateUtil类中,我是这样去得到的:
/***************************************************************************
* 返回当前静态类使用的SessionFactory, 方法根据相应的SessionFactory 在上下文中绑定的 JNDI 名称来获得
*
* @return SessionFactory
*/
public static SessionFactory getSessionFactory() {
if (sessionFactory != null) {
return sessionFactory;
} else {
Context ctx = null;
/* 使用JNDI获取的静态变量的实例 */
try {
ctx = new InitialContext();
sessionFactory = (SessionFactory) ctx
.lookup(Constants.SESSION_FACTORY_JNDI);
} catch (NamingException ex) {
throw new InfrastructureException(ex);
} finally {
try {
ctx.close();
ctx = null;
} catch (NamingException e) {
e.printStackTrace();
}
}
return sessionFactory;
}
}

Constants.SESSION_FACTORY_JNDI 是一个常量字符串,就是你配置时的名字
另外配置时,我只配置了下面的,程序可以正常执行
<property name="hibernate.session_factory_name">hibernate</property>
仅供参考
我后来找到原因,第一个JNDI找不到的错误是因为我把名字写错。第二个错误是因为我使用了JTA的方式去获取Session。
使用JNDI和使用HibernateUtil各有各的好处。
非常感谢您的回复!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics