|
在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目录.
|