使用 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>

你會注意到我匯入了 txjdbc 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\databasejdbc: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 掃描。你應該使用 packagesToScanannotatedClasses,但不能同時使用兩者。宣告如下:

<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 將特定於資料庫的 HibernateExceptionSQLExceptions 轉換為可由應用程式上下文理解的 Spring 異常。

TransactionManager bean 控制事務和回滾。

注意:你應該將你的 SessionFactory bean 自動裝入 DAO 中。