- 译者序
- 前言
- 本书怎么使用
- 本书排版字体约定
- 本书网站
- 致谢
- 第一部分 Hibernate 快速入门
- 第 1 章 安装和设置
- 第 2 章 映射简介
- 第 3 章 驾驭 Hibernate
- 第 4 章 集合与关联
- 第 5 章 更复杂的关联
- 第 6 章 自定义值类型
- 第 7 章 映射标注
- 第 8 章 条件查询
- 第 9 章 浅谈 HQL
- 第二部分 与其他工具的集成
- 第 10 章 将 Hibernate 连接到 MySQL
- 第 11 章 Hibernate 与 Eclipse:Hibernate Tools 使用实战
- 第 12 章 Maven 进阶
- 第 13 章 Spring 入门:Hibernate 与 Spring
- 第 14 章 画龙点睛:用 Stripes 集成 Spring 和 Hibernate
- 附录 A Hibernate 类型
- 附录 B Criteria API
- 附录 C Hibernate SQL 方言
- 附录 D Spring 事务支持
- 附录 E 参考资源
- 作者简介
- 封面介绍
创建应用程序上下文对象
前面介绍 Spring 时,我们讨论了它如何负责创建和连接应用程序中的组件。为了让 Spring 组装各组件,我们需要告诉它系统中有什么组件(Spring 将它们称为 bean)以及它们之间是如何连接在一起的。我们使用一个 XML 文档来描述每个 bean 的类,为每个 bean 分配一个 ID,建立起各个 bean 之间的关联关系。为什么要用 ID?在 Spring 中,ID 就是每个 bean 的惟一的逻辑名称,在表达 bean 之间的关系,以及在运行时请求 bean 时,就会用到 bean 的 ID 属性。在我们的示例 Spring 配置文件中,就使用了诸如 artistDao 和 albumDao 之类的逻辑名称,每个 ID 引用了在配置文件中定义的一个组件。
Spring 再用这个 XML 文档来创建一个 ApplicationContext 对象,利用这个对象我们就可以按名称取回相应的组件。图 13-2 是我们这个程序 ApplicationContext 的内容结构图表。
图 13-2 我们的 Spring 应用程序上下文
从图 13-2 中可以看到,我们的 3 个测试组件与 3 个 DAO 对象连接在一起,每个 DAO 对象都有一个会话工厂对象引用,它负责创建一个 Hibernate 会话对象和连接到数据库。这个应用程序的 Spring 配置文件如例 13-8 所示,应该将它命名为 applicationContext.xml,并放在 src 目录下。
例 13-8:Spring 的配置文件 applicationContext.xml
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation=
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-lazy-init="true">❶
<bean id="sessionFactory"❷
class="org.springframework.orm.hibernate3.annotation.Annotation
SessionFactoryBean">
<property name="annotatedClasses">❸
<list>
<value>com.oreilly.hh.data.Album</value>
<value>com.oreilly.hh.data.AlbumTrack</value>
<value>com.oreilly.hh.data.Artist</value>
<value>com.oreilly.hh.data.StereoVolume</value>
<value>com.oreilly.hh.data.Track</value>
</list>
</property>
<property name="hibernateProperties">❹
<props>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.
transaction.JDBCTransactionFactory</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.connection.pool_size">0</prop>
<prop key="hibernate.connection.driver_class">org.hsqldb
.jdbcDriver</prop>
<prop key="hibernate.connection.url">jdbc:hsqldb:data/music;
shutdown=true</prop>
<prop key="hibernate.connection.username">sa</prop>
<prop key="hibernate.connection.password"></prop>
</props>
</property>
</bean>
<!--enable the configuration of transactional behavior based on
annotations-->
<tx:annotation-driven transaction-manager="transactionManager"/>❺
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotation
BeanPostProcessor"/>❻
<!--Define our Data Access beans-->
<bean id="albumDAO"class="com.oreilly.hh.dao.hibernate.AlbumHibernateDAO">❼
<property name="sessionFactory"ref="sessionFactory"/>
</bean>
<bean id="artistDAO"class="com.oreilly.hh.dao.hibernate.ArtistHibernateDAO">
<property name="sessionFactory"ref="sessionFactory"/>
</bean>
<bean id="trackDAO"class="com.oreilly.hh.dao.hibernate.TrackHibernateDAO">
<property name="sessionFactory"ref="sessionFactory"/>
</bean>
<!--Define our Test beans-->
<bean id="createTest"class="com.oreilly.hh.CreateTest">❽
<property name="trackDAO"ref="trackDAO"/>
<property name="artistDAO"ref="artistDAO"/>
</bean>
<bean id="queryTest"class="com.oreilly.hh.QueryTest">
<property name="trackDAO"ref="trackDAO"/>
</bean>
<bean id="albumTest"class="com.oreilly.hh.AlbumTest">
<property name="albumDAO"ref="albumDAO"/>
<property name="artistDAO"ref="artistDAO"/>
<property name="trackDAO"ref="trackDAO"/>
</bean>
</beans>
嗯,要读的 XML 代码量还不小,不是吗?其实在这个文件中还有很多有趣的东西,接下来就细细梳理一下这个文件中的每个部分:
❶顶级元素是<beans>,为了让 Spring 能够正常运行,我们必须为其声明一些重要的命名空间。http://www.springframework.org/schema/beans 命名空间是用于描述声明的 bean 元素的默认命名空间,而 http://www.springframework.org/schema/tx 命名空间则用于定义标注驱动的事务配置,本章稍后会介绍这一内容。<default-lazy-init>属性控制 Spring IoC 容器的默认行为。如果该默认设置为 true,则只有当请求组件时,Spring 才会实例化这些组件。如果把 default-lazy-init 设置为 false,则 Spring 在 ApplicationContext 初始化期间就实例化相关的 bean。
❷会话工厂这个 bean 负责生成会话对象,处理到 JDBC DataSource 的连接。通常,会话工厂将使用一个 DataSource,我们在 applicationContext.xml 中可以为会话工厂配置一个 Commons DBCP 或 C3P0 连接。为了保持这个例子的完整性,会话工厂的配置直接包含了用于配置 JDBC 连接的各属性。
❸和在 hibernate.cfg.xml 文件中进行配置一样,此处是在定义需要 Hibernate 处理的标注类。
❹hibernateProperties 元素用于配置 Hibernate 的设置。稍后在本章的 13.3.1 节再深入介绍这一配置的细节。
❺事务管理相关的标注配置稍后在本章的 13.4.1 节再深入介绍。tx:annotation-driven 元素和 transactionManager 定义可以让我们使用 Transactional 标注来定义应用程序中任何事务的范围和属性。
❻RequiredAnnotationBeanPostProcessor 是一个没有命名的组件,有了这个组件,就可以为带有 Required 标的 setter 方法激活一些强制处理。如果将这个 Required 标注属性放在必需的 bean 属性的 setter 方法上,Spring 就会在初始化一个 bean 后,再验证这个属性是否被设置。在测试类中可以用这种方法来确保 Spring 已经配置好了我们的 DAO 依赖。
❼在这里定义好了 DAO 对象:albumDAO、artistDAO 以及 trackDAO。
❽在这里定义好了 test bean:createTest、queryTest 以及 albumTest。
Hibernate 配置属性
仔细看看例 13-8 中的 hibernateProperties 部分,其中有许多有趣的配置属性,分别解释如下:
hibernate.connection.driver_class、hibernate.connection.url、hibernate.connection.username、hibernate.connection.password
这几个配置属性负责配置数据库的 JDBC 连接。这些属性与前面几章中的配置属性类似,它们在 applicationContext.xml 中的属性值与早先在 hibernate.cfg.xml 和 hibernate.properties 中的取值完全一样。
hibernate.connection.pool_size
这个属性用于设置 Hibernate 内部连接池(connection pool)容量的大小。如果不使用 Hibernate 提供的连接池,也可以使用 Hibernate 内建的支持 Apache Commons DBCP 或 C3P0,对于产品级系统的部署,这两种连接池都是很好的选择。如果将这个属性值设置成一个非零的数值,Hibernate 就会负责回收和重用数据库的连接。
这种情况很有趣,因为我想为这个示例关掉连接池,以简化 HSQLDB 的使用,所以将 pool_size 设置为 0。当最后一个数据库连接终止时,HSQLDB 需要接收一个 SHUTDOWN 命令,因为在这里我不想再编写和配置一个专门的关闭脚本,而是简单地保证在用完 JDBC Connection 对象后就马上关闭它。
hibernate.dialect
这个属性用于设置 Hibernate 方言(dialect)。现在 Hibernate 支持的所有方言列表,请参阅附录 C。
hibernate.transaction.factory_class
在这个示例中,我们使用 JDBC 驱动程序来管理数据库事务。更复杂的部署环境需要使用 JTA,如果我们使用容器托管的事务,则可以将该属性配置为 org.hibernate.transaction.JTATransactionFactory。
hibernate.show_sql、hibernate.format_sql
如果将 show_sql 设置为 true, Hibernate 将打印输出它正在执行的 SQL 语句。如果你在调试 Spring,想弄清楚某个映射是怎么访问数据库表的,这个配置属性就很有用。如果将 format_sql 设置为 true,就会格式化输出的 SQL 语句;如果将 format_sql 设置为 false, SQL 语句只打印输出到一行。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论