映射文件的命名規則——類名.hbm.xml
映射文件告訴 Hibernate 它應該訪問數據庫(database)裏面的哪個表(table)及應該使用表裏面的哪些字段(column)。
一個映射文件的基本結構:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="Event" table="EVENTS">
</class>- </hibernate-mapping>
注意:可以在文本編輯器裏打開 DTD — 這是最簡單的方式來概覽所有的元素和 attribute,並查看它們的缺省值以及註釋。
Hibernate 不會從 web 加載 DTD 文件,但它會首先在應用程序的 classpath 中查找。DTD 文件已包括在hibernate3.jar
裏
在 hibernate-mapping
標籤(tag)之間, 含有一個
class
元素。所有的持久化實體類都需要一個這樣的映射,來把類對象映射到 SQL 數據庫裏的表。
每個實例對應着數據庫表中的一行。
唯一標識符屬性到數據庫表的映射,由於我們不關心怎樣處理這個標識符,我們就配置由 Hibernate 的標識符生成策略來產生代理主鍵字段
該屬性也是在hibernate-mapping 標籤(tag)之間,代碼如下
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="Event" table="EVENTS">
- <id name="id" column="EVENT_ID">
- <generator class="native"/>
- </id>
- </class>
- </hibernate-mapping>
註釋:id元素是對 identity 屬性的聲明。 name="id" 映射屬性聲明瞭 JavaBean 屬性的名稱並告訴 Hibernate 使用 getId() 和 setId()方法來訪問這個屬性。column 屬性告訴 Hibernate events表中的哪個字段持有主鍵值。
generator 元素指定標識符的生成策略(也就是標識符值是怎麼產生的)。在這個例子裏,我們選擇native
,它提供了取決於數據庫方言的可移植性。Hibernate
數據庫生成的、全局性唯一的以及應用程序分配的標識符。標識符值的生成也是 Hibernate 的擴展功能之一,你可以插入自己的策略。
最後我們在映射文件裏面包含需要持久化屬性的聲明。默認情況下,類裏面的屬性都被視爲非持久化的:
事例代碼如下:
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="Event" table="EVENTS">
- <id name="id" column="EVENT_ID">
- <generator class="native"/>
- </id>
- <property name="date" type="timestamp" column="EVENT_DATE"/>
- <property name="title"/>
- </class>
- </hibernate-mapping>
註釋:和 id 元素一樣,property元素的name屬性告訴 Hibernate 使用哪個 getter 和 setter方法。
注意:爲什麼
date
屬性的映射含有 column
attribute,而
title
卻沒有?當沒有設定 column
attribute的時候,Hibernate 缺省地使用 JavaBean 的屬性名作爲字段名。對於title
,這樣工作得很好。然而,date
在多數的數據庫裏,是一個保留關鍵字,所以我們最好把它映射成一個不同的名字。
如果在映射文件中沒有設置 type
屬性的話,Hibernate 會自己試着去確定正確的轉換類型和它的映射類型。在某些情況下這個自動檢測機制(在 Java 類上使用反射機制)不會產生你所期待或需要的缺省值。date
屬性就是個很好的例子,Hibernate
無法知道這個屬性(java.util.Date
類型的)應該被映射成:SQLdate
,或timestamp
,還是time
字段。在此例中,把這個屬性映射成timestamp
轉換器,這樣我們預留了日期和時間的全部信息。
把新的映射加入到Hibernate的配置中:
格式:<mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>