1在Spring上下文中配置SessionFactory
通過上文的描述,可以知道,Spring使用JdbcTemplate時必須和特定的數據源進行綁定。而在Hibernate中,數據源是對用戶屏蔽的,它使用一個稱為“Session”的強勁武器。
Session具有建立或取消對象的持久關聯、同步對象狀態和數據庫以及事務管理等等復雜功能。Session是Hibernate的核心概念,就如同SqlMap與之IBatis一樣。Session的創建依賴于Hibernate的SessionFactory,SessionFactory和Session一樣,也是Hibernate的核心組件。
和IBatis的整合方式一樣,Spring會將Hibernate基本配置文件中的數據源屬性抽離到Spring自身的配置文件中,以提供統一的數據源管理和注射。
首先,給出Hibernate的配置文件,如代碼10.19所示。
代碼10.19 hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
??????? "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
??????? "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!--??? <property name="connection.driver_class">-->
<!--????? org.postgresql.Driver-->
<!--??? </property>-->
<!--??? <property name="connection.url">-->
<!--????? jdbc:postgresql://1210.0.0.1:5432/hibernate-->
<!--??? </property>-->
<!--??? <property name="connection.username">postgres</property>-->
<!--??? <property name="connection.password">1111</property>-->
??? <!-- SQL dialect -->
??? <property name="dialect">
????? org.hibernate.dialect.PostgreSQLDialect
?? </property>
??? <!-- Echo all executed SQL to stdout -->
??? <property name="show_sql">true</property>
??? <!-- Drop and re-create the database schema on startup -->
??? <property name="hbm2ddl.auto">create</property>
??? <mapping resource="chapter7/hibernate/domain/Category.hbm.xml" />
??? <mapping resource="chapter7/hibernate/domain/Product.hbm.xml" />
</session-factory>
</hibernate-configuration>
注意,代碼10.19中被注釋掉的部分,它將被抽離到了Spring的上下文配置文件,而其余部分則暫時保持不變。
下面給出Spring的配置文件,如代碼10.20所示。
代碼10.20 dataAccessContext-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
??? <property name="locations">
????? <list>
??????? <value>classpath:jdbc.properties</value>
????? </list>
??? </property>
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
??? <property name="driverClassName" value="${jdbc.driverClassName}"/>
??? <property name="url"
??? value="jdbc:postgresql://127.0.0.1:5432/hibernate"/>
??? <property name="username" value="${jdbc.username}"/>
??? <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??? <property name="dataSource" ref="dataSource"/>
??? <property name="configLocations">
????? <value>chapter7/spring/hibernate/hibernate.cfg.xml</value>
??? </property>
<!--??? <property name="mappingResources">-->
<!--????? <list>-->
<!--??????? <value>chapter7/hibernate/domain/Category.hbm.xml</value>-->
<!--??????? <value>chapter7/hibernate/domain/Product.hbm.xml</value>-->
<!--????? </list>-->
<!--??? </property>-->
<!--??? <property name="hibernateProperties">-->
<!--????? <props>-->
<!--??????? <prop key="hibernate.dialect">
???????????????? org.hibernate.dialect.PostgreSQLDialect
?????????????? </prop>-->
<!--??????? <prop key="show_sql">true</prop>-->
<!--??????? <prop key="hbm2ddl.auto">create</prop>-->
<!--????? </props>-->
<!--??? </property>-->
</bean>
</beans>
可以發現,從代碼10.19抽離出的數據源,現在換成了Apache的DBCP連接池。當然,也可以換作其他實現,比如從一個JNDI上獲取的數據源:
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
??? <property name="jndiName" value="java:comp/env/jdbc/myds"/>
</bean>
Spring提供了LocalSessionFactoryBean來創建本地的Hibernate SessionFactory,這就類似于上節中介紹的SqlMapClientFactoryBean(它用以創建IBatis的SqlMap)。當然也可以創建綁定在JNDI上的SessionFactory,不過這通常只在EJB環境下使用。
注意:代碼10.20中被注釋掉的部分,如果不使用LocalSessionFactoryBean的configLocations屬性讀取Hibernate的原生配置文件,可由Spring的LocalSessionFactoryBean負責配置Hibernate,它和hibernate.cfg.xml的作用完全一致,這時候就不需要Hibernate的原生配置了。
posted on 2009-07-27 01:50
jadmin 閱讀(89)
評論(0) 編輯 收藏