注意,我们是简单地从Hibernate.org网站(http://www.hibernate.org)复制了这个HibernateUtil类。而且,该站点也提供了旧版本的HibernateUtil类(并有旧版本的Hibernate);只是更复杂些,而且加入了一个ThreadLocal实例。在当前的Hibernate.org站点上,你能够找到一篇文章“Hibernate会话与事务”(http://www.hibernate.org/42.html),其中提到:
“……注意:在网上存在许多种更为复杂的HibernateUtil类。然而,对于Hibernate 3.1来说,上面的代码才是唯一需要的代码。其它任何HibernateUtil类对于Hibernate 3.1都已过时……”
让我们假定你的servlet仅局限于几种类型的数据库查询—没有以任何方式更新数据库。于是,它可以以下列方式使用HibernateUtil类中提供的Hibernate SessionFactory:
广州网站建设,网站建设,广州网页设计,广州网站设计
|
Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); ...[retrieve desired results via a Hibernate query] session.getTransaction().commit(); //自动关闭会话 |
【注意】根据来自Hibernate参考文档的意见,即使是一个利用SessionFactory.openSession()实现的简单查询也应该使用一个Hibernate事务并实现事务提交。我们将遵循这一建议—它不会有任何负作用。 比如说,你还有一个servlet,它使用Hibernate执行某种数据库更新;那么,你的代码可能类似如下(与上面基本相同):
|
Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Car bigSUV = new Car(); bigSUV.setManufacturer("Ford"); bigSUV.setModel("Expedition"); bigSUV.setYear(2005); Driver jill = getDriverByName("Jill"); addCarToDriver(jill, bigSUV); session.getTransaction().commit(); //自动关闭会话 |
四、Hibernate.cfg.xml
HibernateUtil.java中的方法org.hibernate.cfg.Configuration().configure()负责在classpath内查找Hibernate配置文件hibernate.cfg.xml。因此,下一步我们必须查找这个文件。它应该位于Tomcat应用程序的WEB-INF/classes目录(或其下的一个子目录)下的classpath中。下面的屏幕快照显示了hibernate.cfg.xml(以及log4j.properties文件,它也要求位于这个classpath下)的位置。
广州网站建设,网站建设,广州网页设计,广州网站设计
下面是我们在本系列文章中所使用的这个Hibernate配置文件的完整源码。
|
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> |
在此,我们需要解释一下这个配置文件中的有关内容;当然,还有一些没有出现在此文件中的内容。首先应该注意的是这个文件内的
|
|
然后注意,入口
另外,你在这个文件中并没有看到一个xml属性(而不是一个子元素)。具体地说,你没有在session-factory元素中看到name属性。也即是,你没有看到类似如下的内容:
|
|
如果存在name属性—正如你在一个应用程序服务器环境下期望的那样,那么,HibernateUtil内的静态初始化器将调用BuildSessionFactory():
广州网站建设,网站建设,广州网页设计,广州网站设计
|
sessionFactory =new Configuration().configure().buildSessionFactory(); |
于是发生下列情况:Hibernate试图把会话工厂入口安装到JNDI中。这在一个应用程序服务器情况下的确不错,但是在Tomcat只读版本的JNDI情况下却不是这样(将抛出一个异常)。在一个应用程序服务器中,对于当前版本的HibernateUtil,第二种可能性的变化是:getSessionfactory()方法将从JNDI中(而不是从静态变量中)检索SessionFactory引用。



