/**
作者:Willpower
来源:Rifoo Technology(http://www.rifoo.com)
时间:2006-06
备注:转载请保留以上声明
**/
今天我们一起来学习Hibernate的集成和配置。
对于其他的JAVA持久化解决方案来说,集成Hibernate到一个JAVA应用是一件非常容易的事情。
相对其他解决方案,Hibernate的设计者避免了更多通用的缺陷和问题,创建了一个轻巧但强大的框架。
所谓轻巧,也就是我们不需要特定的J2EE容器或框架来运行hibernate,其实Hibernate 3仅仅只需要J2SE 1.2或以上版本支持即可(最新的注释功能annotations需要J2SE 5.0支持)。
如果有一个应用是使用Hibernate 2的,那么从Hibernate 2移植到Hibernate 3是非常容易的。
Hibernate 3并不是完全向下兼容的,但是大部分的改变是一些额外的功能,这些功能是我们能够集成到到现有系统中的。 Hibernate开发者在Hibernate 3中提供了Hibernate 2核心对象的实现,使得可以向下兼容Hibernate 2的方法。本书的第14章将会详细讨论Hibernate 2和Hibernate 3的更多不同和区别。
Hibernate的设计中最关键的一个特征是尽可能少的“侵入”,众所周知,EJB是一个侵入性很强的框架。因此,Hibernate在这一点上要优于EJB。
集成Hibernate到JAVA应用中
我们可以直接在JAVA应用中调用Hibernate或者通过其他框架来访问Hibernate。Hibernate支持JAVA管理扩展(JMX),JAVA连接器框架(JCA)和JAVA命名目录接口(JNDI)标准。
使用JMX,我们能够在运行时配置Hibernate。Hibernate可以部署为一个JCA连接器,并且我们可以使在应用中用JNDI来获得一个Hibernate的session factory。
另外,Hibernate使用标准的JDBC数据库驱动来访问关系数据库。Hibernate并不是一个JDBC替换品,它只是在JDBC之上封装的一层。
除了标准JAVA API之外,许多JAVA web和application framework都集成了Hibernate。比如Spring framework提供了优秀的Hibernate集成,它通过在底层封装,提供了一些持久对象的通用支持,持久异常的集合,以及事务管理。我们可以首先从Spring的HibernateTemplate类来开始学习。有关Spring的更多消息可以访问它的官方网站http://www.springframework.org
无论通过什么方式来访问Hibernat,我们都需要创建一个Hibernate configuration,即配置文件。然后,在配置文件中创建一个Hibernate的session factory(会话工厂)。一旦我们有了一个session factory,我们的应用就可以向这个factory请求session(这里的会话和一般的http的session意义不同)。我们的应用将使用Hibernate的session来管理持久化对象。
在后面,我们会详细讨论如何使用Configuration类来设置所有JAVA应用的Hibernate实例。
部署Hibernate
要集成hibernate到我们的应用中,首先需要使用一些JAVA的类库。
第一个类库是JDBC的jar文件,不管是哪种关系数据库,Oracle,MSSQL还是MySQL都提供自己的JDBC jar,我们选我们使用的就可以了。在Hibernate中有dialect这个概念,也就是方言的意思,是说不同的数据库除了标准SQL外,都提供了各自的SQL扩展,比如Oracle有PLSQL,MSSQL有T-SQL等,这些区分在Hibernate中用方言这个概念来理解。我们将在稍候讨论dialect的详细使用。而且hibernate官方网站的FAQ中也有专门针对不同厂商数据库疑问的解决方案。
如果我们的JDBC版本比较老了,我们依然要使用hibernate的话,那么我们必须要禁用两个JDBC 2的特殊功能:batch update和scrollable result set。(这里我解释一下,前者是用来批处理更新操作,后者主要用在对存储过程的调用)。我们可以通过在配置中做如下设置:hibernate.jdbc.batch_size=0
hibernate.jdbc.use_scrollable_resultsets=false
在配置完JDBC驱动后,下一步就是部署hibernate3.jar到我们的应用中。
运行Hibernate3需要的类库
当我们下载了Hibernate3的发布包后,我们可以看到一个lib目录,这个lib目录里有许多类库(也就是java的jar文件),我们可以打开其中的readme文件,里面清楚的说明了哪些是必需的(比如cglib,dom4j等),哪些是可选的(如oscache,log4J等)。有些是在编译时需要的,有些是运行时需要的。大家可以详细看看那个文件,具体这就不多说了。
下面将Hibernate3的lib/readme文件内容贴出来,方便大家查阅:
ehcache-1.1.jar (1.1)
- EHCache cache
- runtime, optional (required if no other cache provider is set)
versioncheck.jar (1.0)
- version checker
- buildtime
swarmcache-1.0rc2.jar (1.0rc2)
- runtime, optional
- runtime, optional
jboss-cache.jar (1.2.2 alpha)
- TreeCache clustered cache
- runtime, optional
jgroups-2.2.7.jar (2.2.7)
- JGroups multicast library
- runtime, optional (required by replicated caches)
jta.jar (unknown)
- Standard JTA API
- runtime, required for standalone operation (outside application server)
xml-apis.jar (unknown)
- Standard JAXP API
- runtime, some SAX parser is required
commons-logging-1.0.4.jar (1.0.4)
- Commons Logging
- runtime, required
c3p0-0.8.5.2.jar (0.8.5.2)
- C3P0 JDBC connection pool
- runtime, optional
connector.jar (unknown)
- Standard JCA API
- runtime, optional
jboss-system.jar (unknown)
- unknown name
- runtime, optional (required by TreeCache)
asm-attrs.jar (unknown)
- ASM bytecode library
- runtime, required
jacc-1_0-fr.jar (1.0-fr)
- JACC Library
- runtime, optional
checkstyle-all.jar (unknown)
- Checkstyle
- buildtime
log4j-1.2.9.jar (1.2.9)
- Log4j Library
- runtime, optional
junit-3.8.1.jar (3.8.1)
- JUnit test framework
- buildtime
dom4j-1.6.jar (1.6)
- XML configuration & mapping parser
- runtime, required
antlr-2.7.5H3.jar (2.7.5H3)
- ANother Tool for Language Recognition (patched with proper context classloading)
- runtime
cglib-2.1.jar (2.1.0)
- CGLIB bytecode generator
- runtime, required
jboss-common.jar (unknown)
- unknown name
- runtime, optional (required by TreeCache)
oscache-2.1.jar (2.1)
- OpenSymphony OSCache
- runtime, optional
asm.jar (unknown)
- ASM bytecode library
- runtime, required
ant-launcher-1.6.3.jar (1.6.3)
- Ant launcher
- buildtime
jaas.jar (unknown)
- Standard JAAS API
- runtime, optional (required by JCA)
jdbc2_0-stdext.jar (2.0)
- Standard Extension JDBC APIs
- runtime, required for standalone operation (outside application server)
ant-antlr-1.6.3.jar (1.6.3)
- Ant antlr support
- buildtime
jboss-jmx.jar (unknown)
- unknown name
- runtime, optional (required by TreeCache)
cleanimports.jar (unknown)
- cleanimports
- buildtime
xerces-2.6.2.jar (2.6.2)
- SAX parser
- runtime, required for JDK < 1.4
jaxen-1.1-beta-4.jar (1.1-beta-4)
- Jaxen - universal java xpath engine
- runtime, required if you want to deserialize a Configuration to improve startup performance
ant-junit-1.6.3.jar (1.6.3)
- Ant junit support
- buildtime
ant-swing-1.6.3.jar (1.6.3)
- Ant swing support
- buildtime
commons-collections-2.1.1.jar (2.1.1)
- Commons Collections
- runtime, required
ant-1.6.3.jar (1.6.3)
- Ant core
- buildtime
proxool-0.8.3.jar (0.8.3)
- Proxool JDBC connection pool
- runtime, optional
concurrent-1.3.2.jar (1.3.2)
- unknown name
- runtime, optional (required by TreeCache)