数据持久化的高级需求:
延迟加载(lazy loading):随着对象关系变得越来越复杂,有时候我们并不希望立即获取完整的对象间关系。借助于延迟加载,我们可以只抓取需要的数据。我的理解是:例如,对象B是对象A的一个属性,如果我们只需要对象A的数据,那么在加载A对象的时候,就会加载B对象的数据,如果数据是大量的,那么这个就是一个开销很大的操作。借助于延迟加载,我们可以只取我们所需要的A对象的数据。
预先抓取(eager fetching):与延迟加载是相对的。借助于预先抓取,我们可以使用一个查询获取完整的关联对象。我的理解是:对象B是对象A的一个属性,我们需要A对象和B对象的数据,可能需要进行多次查询,预先抓取可以在一个操作中就将所有数据全部从数据库提取出来,避免多次查询。
级联(cascading):有时候,更改数据库中某一个表,会同时需要修改其他表。我的理解是:例如,学生表和学生选课表,如果我们更改学生表里的学生对象,那么我们就希望同时可以更改学生选课表的学生对象;如果我们删去一个学生对象,那么就需要删去该学生对象的选课对象。
Spring支持的持久化框架有:Hibernate,iBATIS,JAVA数据对象(JAVA Data Objects,JDO)和JAVA持久化API。那么Spring是如何集成Hibernate的?
Spring提供了模板类来抽象Hibernate的持久化功能。以前,是通过HibernateTemplate来简化Hibernate的工作,它的职责之一就是管理Hibernate的session,但它的不足之处是存在一定程度的侵入性。在DAO中使用HibernateTemplate时,DAO类就会与SpringAPI产生耦合。
Hibernate3引入了上下文session(Contextual session),确保每个事务使用同一个session。
获取Hibernate Session对象的标准方式是借助于Hibernate的SessionFactory接口的实现类,SessionFactory主要负责HibernateSession的打开、关闭和管理。
如果使用XML文件来配置Hibernate Session,那么如下:
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="datasource" ref="datasource">
<property name="mappingResource">//配置一个或者多个hibernate映射文件,定义了应用程序的持久化策略
<list>
<value>A.hbm.xml</value>//A是对象
</list>
</property>
<property name="hibernateProperties">//该属性配置了hibernate如何进行操作的细节
<props>
<prop key="dialect">org.hibernate.dialect.HSQLDialect</prop>//配置hibernate使用Hypersonic数据库并且要按照HSQLDialect来构建SQL
/props>
<property>
</bean>
如果用注解的方式来定义持久化,那么如下
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="datasource"/>//从哪里获得数据库连接
<property name="packageToscan" value="com.habuma.A.domain" />
<property name="hebernateProperties">//要使用哪一种数据库
<props>
<prop key="dialect">org.hibernate.dialect.HSQLDialect</prop>
</props>
</property>
</bean>