一、
????????????
Hibernate
訪問數據庫時加載的過程
對于大多數使用
Hibernate
的朋友來說,通常使用一下方式來獲得
Configuration
實例:
Configuration configure = new Configuration().configure();
在
Hibernate
中,
Configuration
是
hibernate
的入口。在實例化一個
Configuration
的時候,
Hibernate
會自動在環境變量(
classpath
)里面查找
Hibernate
配置文件
hibernate.properties
。如果該文件存在,則將該文件的內容加載到一個
Properties
的實例
GLOBAL_PROPERTIES
里面,如果不存在,將打印信息
hibernate.properties not found
;
接下來
Hibernate
將所有系統環境變量(
System.getProperties()
)也添加到
GLOBAL_PROPERTIES
里面。如果配置文件
hibernate.properties
存在,系統還會進一步驗證這個文件配置的有效性,對于一些已經不支持的配置參數,系統將打印出警告信息。
默認狀態下
configure()
方法會自動在環境變量(
classpath
)下面尋找
Hibernate
配置文件
hibernate.cfg.xml
,如果該文件不存在,系統會打印如下信息并拋出
HibernateException
異常
: hibernate.cfg.xml not found
;
如果該文件存在,
configure()
方法會首先訪問<
session-factory
>,并獲取該元素
name
的屬性,如果
name
的屬性非空,將用這個配置的值來覆蓋
hibernate.properties
的
hibernate.session_factory_name
的配置的值,從這里我們可以看出,
hibernate.cfg.xml
里面的配置信息可以覆蓋
hibernate.properties
的配置信息。
接下來
configure()
方法訪問<
session-factory
>的子元素,首先將使用所有的<
property
>元素配置的信息來覆蓋
hibernate.properties
里面對應的配置信息。
然后
configure()
會依次訪問以下幾個元素的內容
<
mapping
>
<
jcs-class-cache
>
<
jcs-collection-cache
>
<
collection-cache
>
其中<
mapping
>是必不可少的,必須通過配置<
mapping
>,
configure()
才能訪問到我們定義的
java
對象和關系數據庫表的映射文件(
hbm.xml
),例如:
<
mapping resource="Cat.hbm.xml"/
>
這樣
configure()
方法利用各種資源就創建了一個
Configuration
實例。對于整個項目來說,如果用一個本地線程來存放這個
Configuration
實例,那么整個項目只需要實例化一次
Configuration
對象(注:
Configuration
實例很花費時間),也就提高了項目的效率。
?
二、 ???????????? Hibernate 訪問多個數據庫的配置
根據以上所述,
configure()
方法默認是通過訪問
hibernate.cfg.xml
的<
mapping
>元素來加載我們提供的
.hbm.xml
文件。我們也可以直接指定
hbm.xml
文件,例如
addClass()
方法可以直接通過指定
class
來加載對應的映射文件,
hibernate
會將提供的
class
的全名(包括
package
)自動轉化為文件路徑,還可以用
addFile
方法直接指定映射文件。例如:
Configuration configurate = new Configuration().addClass(“Book.class”);
Configuration configurate = new Configuration().addURL(Configuration.class.getResource ("/Book.hbm.xml"));
Configuration config = new Configuration().addFile("/Cat.hbm.xml");
這樣,如果用
xml
配置來配置多個數據庫的話,那就寫多個配置文件。這里假設對應兩個數據庫(一個是
MySQL
,一個是
SQLServer
),我們可以把其
xml
文件定義為“
mysql.cfg.xml
”和“
sqlserver.cfg.xml
”。則用
Configuration
類獲取
SessionFactory
的代碼如下:
SessionFactory mysqlFactory = new Configuration().configure("/mysql.cfg.xml").buildSessionFactory();
SessionFactory sqlserverFactory = new Configuration().configure("sqlserver.cfg.xml ").buildSessionFactory();
如果你用
spring
,多數據庫就更簡單了,像這段代碼可以完成所有配置:
<beans>
<bean id="mysqlDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123</value>
</property>
</bean>
<bean id="mysqlFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="mysqlDS"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>test.hbm.xml</value>
</list>
</property>
</bean>
<bean id="sqlserverDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:odbc:test</value>
</property>
<property name="driverClassName">
<value>sun.jdbc.odbc.JdbcOdbcDriver</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123</value>
</property>
</bean>
<bean id="sqlserverFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="sqlserverDS"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>test.hbm.xml</value>
</list>
</property>
</bean>
.......
</beans>
以上只是配置
Hibernate
訪問多個數據庫的一般方法,
hibernate
還有很多可行的配置,有興趣的讀者可以參考它的
reference
。
本Blog純屬個人學習、工作需要,記錄相關資料。請不要發表任何有人身攻擊的言論,謝謝! www.zhipsoft.cn