到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comwww.javaresearch.org无关,不对该信息负责.通过http://www.javaresearch.org/article//showarticle.jsp?column=108&thread=37292访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
Hibernate数据源问题补充
作者:zhyiwww 来源:www.javaresearch.org  发布时间:2006-03-05 02:43:24.737


在Hibernate.cfg.xml中配置的数据源只能在Web环境下使用,我们可以通过下面的例子来比较.
如果我们在HibernateSessionFactory中加上测试,代码如下:
package sc.pro.forum.util;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.cfg.Configuration;

/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {@link http://hibernate.org/42.html}.
 */
public class HibernateSessionFactory {

    /** 
     * Location of hibernate.cfg.xml file.
     * NOTICE: Location should be on the classpath as Hibernate uses
     * #resourceAsStream style lookup for its configuration file. That
     * is place the config file in a Java package - the default location
     * is the default Java package.<br><br>
     * Examples: <br>
     * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml". 
     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code> 
     */
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

    /** Holds a single instance of Session */
    private static final ThreadLocal threadLocal = new ThreadLocal();

    /** The single instance of hibernate configuration */
    private static final Configuration cfg = new Configuration();

    /** The single instance of hibernate SessionFactory */
    private static net.sf.hibernate.SessionFactory sessionFactory;

    /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session currentSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null) {
            if (sessionFactory == null) {
                try {
                    cfg.configure(CONFIG_FILE_LOCATION);
                    sessionFactory = cfg.buildSessionFactory();
                }
                catch (Exception e) {
                    System.err.println("%%%% Error Creating SessionFactory %%%%");
                    e.printStackTrace();
                }
            }
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }

        return session;
    }

    /**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

    public static void main(String[] args){
        System.out.println("sdfsdfsd");
        try{
        Session  session=HibernateSessionFactory.currentSession();
        if(session==null)
            System.out.println("session is null");
        else 
            System.out.println("session  is  not  null");
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    /**
     * Default constructor.
     */
    private HibernateSessionFactory() {
    }
    
}
执行时,程序会给我们如下的错误:
Environment - Hibernate 2.1.7
Environment - hibernate.properties not found
Environment - using CGLIB reflection optimizer
Environment - using JDK 1.4 java.sql.Timestamp handling
sdfsdfsd
Configuration - configuring from resource: /hibernate.cfg.xml
Configuration - Configuration resource: /hibernate.cfg.xml
DTDEntityResolver - trying to locate http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd in classpath under net/sf/hibernate/
DTDEntityResolver - found http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd in classpath
Configuration - connection.datasource=java:comp/env/jdbc/forum
Configuration - show_sql=true
Configuration - dialect=net.sf.hibernate.dialect.SQLServerDialect
Configuration - null<-org.dom4j.tree.DefaultAttribute@18088c0 [Attribute: name resource value "sc/pro/forum/dao/Userinfo.hbm.xml"]
Configuration - Mapping resource: sc/pro/forum/dao/Userinfo.hbm.xml
DTDEntityResolver - trying to locate http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd in classpath under net/sf/hibernate/
DTDEntityResolver - found http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd in classpath
Binder - Mapping class: sc.pro.forum.dao.Userinfo -> UserInfo
Binder - Mapped property: userid -> UserID, type: integer
Binder - Mapped property: password -> password, type: string
Binder - Mapped property: nickname -> nickname, type: string
Configuration - Configured SessionFactory: null
Configuration - properties: {java.runtime.name=Java(TM) 2 Runtime Environment, Standard Edition, sun.boot.library.path=C:\Program Files\Java\j2re1.4.2_03\bin, java.vm.version=1.4.2_03-b02, connection.datasource=java:comp/env/jdbc/forum, java.vm.vendor=Sun Microsystems Inc., java.vendor.url=http://java.sun.com/, path.separator=;, java.vm.name=Java HotSpot(TM) Client VM, file.encoding.pkg=sun.io, user.country=CN, sun.os.patch.level=Service Pack 4, java.vm.specification.name=Java Virtual Machine Specification, user.dir=E:\86vr\forum, java.runtime.version=1.4.2_03-b02, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, java.endorsed.dirs=C:\Program Files\Java\j2re1.4.2_03\lib\endorsed, os.arch=x86, java.io.tmpdir=C:\DOCUME~1\zhangyi\LOCALS~1\Temp\, line.separator=
, java.vm.specification.vendor=Sun Microsystems Inc., user.variant=, os.name=Windows 2000, sun.java2d.fontpath=, hibernate.connection.datasource=java:comp/env/jdbc/forum, java.library.path=C:\Program Files\Java\j2re1.4.2_03\bin;.;C:\WINNT\system32;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;d:\Program Files\cvsnt;D:\j2sdk1.4\bin;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\Program Files\CVSNT\, java.specification.name=Java Platform API Specification, java.class.version=48.0, java.util.prefs.PreferencesFactory=java.util.prefs.WindowsPreferencesFactory, os.version=5.0, user.home=C:\Documents and Settings\zhangyi, user.timezone=, java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=GBK, java.specification.version=1.4, show_sql=true, user.name=zhangyi, java.class.path=E:\86vr\forum\WebRoot\WEB-INF\classes;E:\86vr\forum\WebRoot\WEB-INF\lib\ant-1.5.3.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\ant-optional-1.5.3.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\c3p0-0.8.4.5.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\cglib-full-2.0.2.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\commons-collections-2.1.1.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\commons-dbcp-1.2.1.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\commons-lang-1.0.1.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\commons-logging-1.0.4.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\commons-pool-1.2.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\concurrent-1.3.3.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\connector.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\dom4j-1.4.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\ehcache-0.9.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\hibernate2.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jaas.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jboss-cache.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jboss-common.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jboss-jmx.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jboss-system.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jcs-1.0-dev.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jdbc2_0-stdext.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jgroups-2.2.7.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\jta.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\junit-3.8.1.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\log4j-1.2.8.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\msbase.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\mssqlserver.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\msutil.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\odmg-3.0.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\oscache-2.0.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\proxool-0.8.3.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\swarmcache-1.0rc2.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\xalan-2.4.0.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\xerces-2.4.0.jar;E:\86vr\forum\WebRoot\WEB-INF\lib\xml-apis.jar, hibernate.show_sql=true, java.vm.specification.version=1.0, java.home=C:\Program Files\Java\j2re1.4.2_03, sun.arch.data.model=32, hibernate.dialect=net.sf.hibernate.dialect.SQLServerDialect, user.language=zh, java.specification.vendor=Sun Microsystems Inc., awt.toolkit=sun.awt.windows.WToolkit, hibernate.cglib.use_reflection_optimizer=true, java.vm.info=mixed mode, java.version=1.4.2_03, java.ext.dirs=C:\Program Files\Java\j2re1.4.2_03\lib\ext, sun.boot.class.path=C:\Program Files\Java\j2re1.4.2_03\lib\rt.jar;C:\Program Files\Java\j2re1.4.2_03\lib\i18n.jar;C:\Program Files\Java\j2re1.4.2_03\lib\sunrsasign.jar;C:\Program Files\Java\j2re1.4.2_03\lib\jsse.jar;C:\Program Files\Java\j2re1.4.2_03\lib\jce.jar;C:\Program Files\Java\j2re1.4.2_03\lib\charsets.jar;C:\Program Files\Java\j2re1.4.2_03\classes;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\activation.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\javax.servlet.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\javax.servlet.jsp.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\jboss-j2ee.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\jboss-jaxrpc.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\jboss-jsr77.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\jboss-saaj.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\mail.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\namespace.jar;f:\green\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_3.8.3\data\libraryset\1.4\xml-apis.jar, java.vendor=Sun Microsystems Inc., file.separator=\, java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, dialect=net.sf.hibernate.dialect.SQLServerDialect, sun.cpu.isalist=pentium i486 i386}
Configuration - processing one-to-many association mappings
Configuration - processing one-to-one association property references
Configuration - processing foreign key constraints
Dialect - Using dialect: net.sf.hibernate.dialect.SQLServerDialect
SQLExceptionConverterFactory - Using dialect defined converter
SettingsFactory - Use outer join fetching: true
NamingHelper - JNDI InitialContext properties:{}
DatasourceConnectionProvider - Could not find datasource: java:comp/env/jdbc/forum
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 net.sf.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:44)
    at net.sf.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:83)
    at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:76)
    at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1160)
    at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:794)
    at sc.pro.forum.util.HibernateSessionFactory.currentSession(HibernateSessionFactory.java:49)
    at sc.pro.forum.util.HibernateSessionFactory.main(HibernateSessionFactory.java:79)
%%%% Error Creating SessionFactory %%%%
net.sf.hibernate.HibernateException: Could not find datasource
    at net.sf.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:48)
    at net.sf.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:83)
    at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:76)
    at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1160)
    at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:794)
    at sc.pro.forum.util.HibernateSessionFactory.currentSession(HibernateSessionFactory.java:49)
    at sc.pro.forum.util.HibernateSessionFactory.main(HibernateSessionFactory.java:79)
Caused by: 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 net.sf.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:44)
    ... 6 more
java.lang.NullPointerException
    at sc.pro.forum.util.HibernateSessionFactory.currentSession(HibernateSessionFactory.java:56)
    at sc.pro.forum.util.HibernateSessionFactory.main(HibernateSessionFactory.java:79)
如果我们在Servlet  中使用HibernateSessionFactory,如LoginServlet:
/*
 * Created on 2005-9-16
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package sc.pro.forum.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sc.pro.forum.dao.*;
import sc.pro.forum.logic.*;
import sc.pro.forum.util.HibernateSessionFactory;
import net.sf.hibernate.Session;
/**
 * @author zhangyi
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class LoginServlet extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public LoginServlet() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    /**
     * The doPost method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to
     * post.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out
                .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the POST method");
        //get the userID
        String userID = request.getParameter("userID").trim();
        out.println(userID);
        //get the value of the password
        String password = request.getParameter("password").trim();
        out.println(password);

        //compose the user information
        Userinfo userinfo = new Userinfo();
        userinfo.setUserid(new Integer(userID));
        userinfo.setPassword(password);

        //judge whether the current user is available
        UserLogic ul = new UserLogic(userinfo);

        boolean login = ul.isUserAvailable();

        if (login) {
            //if user login successfully
            out.println("login  successfully");
        } else {
            out.println("login  failure");
        }

         

        try{
        Session  s=HibernateSessionFactory.currentSession();
        out.println(s);
        }catch(Exception e){
            e.printStackTrace();
        }
        


        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

    /**
     * Initialization of the servlet. <br>
     * 
     * @throws ServletException
     *             if an error occure
     */
    public void init() throws ServletException {
        // Put your code here
    }

}

程序的执行结果是:

This is class sc.pro.forum.servlet.LoginServlet, using the POST method 1111 sfjksdjflsdf login failure 

net.sf.hibernate.impl.SessionImpl@1be9a50 


说明由HibernateSessionFactory产生的Session是有效的.
这也就说明如果Hibernate的配置中使用了数据源的话,那么我们只能在Web环境中使用其工厂.

注意:这是在tomcat下的实现,如果是在Weblgoic下是不用的,因为在Weblogic 下可以直接访问其Context目录.



 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读