使用 XML Configuration 設定 Hibernate
我在類路徑的某處建立了一個名為 database-servlet.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>
你會注意到我匯入了 tx
和 jdbc
Spring 名稱空間。這是因為我們將在此配置檔案中大量使用它們。
你要做的第一件事是啟用基於註釋的事務管理(@Transactional
)。人們在 Spring 中使用 Hibernate 的主要原因是 Spring 將為你管理所有事務。將以下行新增到配置檔案中:
<tx:annotation-driven />
我們需要建立一個資料來源。資料來源基本上是 Hibernate 用來持久儲存物件的資料庫。通常,一個事務管理器將具有一個資料來源。如果你希望 Hibernate 與多個資料來源通訊,那麼你有多個事務管理器。
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
這個 bean 的類可以是實現 javax.sql.DataSource
的任何東西,所以你可以自己編寫。此示例類由 Spring 提供,但沒有自己的執行緒池。一個流行的替代品是 Apache Commons org.apache.commons.dbcp.BasicDataSource
,但還有很多其他的。我將解釋下面的每個屬性:
-
driverClassName :JDBC 驅動程式的路徑。這是一個特定於資料庫的 JAR,應該可以在類路徑中使用。確保你擁有最新版本。如果你使用的是 Oracle 資料庫,則需要 OracleDriver。如果你有一個 MySQL 資料庫,你需要一個 MySQLDriver。看看你是否能找到你需要的驅動程式, 但快速谷歌應該給你正確的驅動程式。
-
url :資料庫的 URL。通常這會像
jdbc\:oracle\:thin\:\path\to\your\database
或jdbc:mysql://path/to/your/database
。如果你四處尋找你正在使用的資料庫的預設位置,你應該能夠找到它應該是什麼。如果你收到帶有org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
訊息的HibernateException
並且你正在閱讀本指南,那麼你的網址錯誤的可能性為 90%,資料庫未啟動的可能性為 5%,使用者名稱/密碼的可能性為 5%。是錯的。 -
username :使用資料庫進行身份驗證時使用的使用者名稱。
-
password :使用資料庫進行身份驗證時使用的密碼。
接下來,就是設定 SessionFactory
。這是 Hibernate 用來建立和管理事務,並實際與資料庫進行對話的事情。它有很多配置選項,我將在下面解釋。
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="au.com.project />
<property name="hibernateProperties">
<props>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
-
dataSource :你的資料來源 bean。如果你更改了 dataSource 的 Id,請在此處進行設定。
-
packagesToScan :要掃描的包以查詢 JPA 註釋物件。這些是會話工廠需要管理的物件,通常是 POJO,並使用
@Entity
進行註釋。有關如何在 Hibernate 中設定物件關係的更多資訊,請參見此處 。 -
annotatedClasses (未顯示):如果 Hibernate 不是全部在同一個包中,你還可以提供一個類列表供 Hibernate 掃描。你應該使用
packagesToScan
或annotatedClasses
,但不能同時使用兩者。宣告如下:
<property name="annotatedClasses">
<list>
<value>foo.bar.package.model.Person</value>
<value>foo.bar.package.model.Thing</value>
</list>
</property>
- hibernateProperties :這裡有無數的精心記錄 。你將使用的主要內容如下:
- hibernate.hbm2ddl.auto :最熱門的 Hibernate 問題之一詳述了這個屬性。檢視更多資訊 。我通常使用 validate,並使用 SQL 指令碼(對於記憶體)設定我的資料庫,或者事先建立資料庫(現有資料庫)。
- hibernate.show_sql :Boolean flag,如果為 true Hibernate 會將它生成的所有 SQL 列印到
stdout
。你還可以配置記錄器,通過在日誌管理器中設定log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.SQL=DEBUG
來顯示繫結到查詢的值(我使用 log4j)。 - hibernate.format_sql :布林標誌,將導致 Hibernate 將 SQL 列印到 stdout。
- hibernate.dialect (未顯示,有充分理由):很多舊的教程向你展示如何設定它將用於與資料庫通訊的 Hibernate 方言。Hibernate 可以根據你使用的 JDBC 驅動程式自動檢測要使用的方言。由於有大約 3 種不同的 Oracle 方言和 5 種不同的 MySQL 方言,我將這個決定留給 Hibernate。有關 Hibernate 支援的完整方言列表,請參閱此處 。
你需要宣告的最後兩個 bean 是:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
id="PersistenceExceptionTranslator" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
PersistenceExceptionTranslator
將特定於資料庫的 HibernateException
或 SQLExceptions
轉換為可由應用程式上下文理解的 Spring 異常。
TransactionManager
bean 控制事務和回滾。
注意:你應該將你的 SessionFactory
bean 自動裝入 DAO 中。