1 Hibernate 的核心接口之一
SessionFactory 接口:SessionFactroy 接口负责初始化 Hibernate 。它充当数据存储源的代理,并负责创建Session 对象。这里用到了工厂模式。需要注意的是SessionFactory 并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory 就够,当需要操作多个数据库时,可以为每个数据库指定一个 SessionFactory 。
2 管理 SessionFactory
SessionFactory :单个数据库映射关系编译后的内存镜像。大部分情况下,一个J2EE 应用对应一个数据库。Spring 通过ApplicationContext 管理SessionFactory ,无须采用单独Hiberate 应用必需的hibernate.cfg.xml 文件。
SessionFactory 与数据库的连接,都由Spring 的配置管理。实际的J2EE 应用,通常使用数据源,数据源会采用依赖注入的方式,传给Hibernate 的SessionFactory 。具体配置如下所示:
<?xml version="1.0" encoding="gb2312"?>
<!-- Spring 配置文件的 DTD 定义 -->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- Spring 配置文件的根元素是 beans-->
<beans>
<!-- 定义数据源 , 该 bean 的 ID 为 dataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource>
<!-- 指定数据库驱动 -->
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<!-- 指定连接数据库的 URL-->
<property name="url"><value>jdbc:mysql://wonder:3306/j2ee</value></property>
<!-- root 为数据库的用户名 -->
<property name="username"><value>root</value></property>
<!-- pass 为数据库密码 -->
<property name="password"><value>pass</value></property>
</bean>
<!-- 定义 Hibernate 的 SessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 依赖注入数据源,注入正是上文定义的 dataSource>
<property name="dataSource"><ref local="dataSource"/></property>
<!-- mappingResouces 属性用来列出全部映射文件 >
<property name="mappingResources">
<list>
<!-- 以下用来列出所有的 PO 映射文件 -->
<value>lee/MyTest.hbm.xml</value>
</list>
</property>
<!-- 定义 Hibernate 的 SessionFactory 的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定 Hibernate 的连接方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!-- 不同数据库连接,启动时选择 create,update,create-drop-->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
</beans>
SessionFactory 由ApplicationContext 管理,会随着应用启动时候自动加载。SessionFactory 可以被处于ApplicaionContext 管理的任意一个bean 引用,比如DAO 。Hibernate 的数据库访问需要在Session 管理下,而SessionFactory 是Session 的工厂。Spring 采用依赖注入为DAO 对象注入SessionFactory 的引用。
Spring 更提供Hibernate 的简化访问方式,Spring 采用模板设计模式,提供Hibernate 访问与其他持久层访问的一致性。如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory 无须任何修改,只需将dataSource 的配置替换成JNDI 数据源,将原有的dataSource Bean 替换成如下所示:
<!-- 此处配置 JNDI 数据源 -->
<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<!-- 指定数据源的 JNDI-->
<value>java:comp/env/jdbc/myds</value>
</property>
</bean>