初識Hibernate的主配置和映射配置
Hibernate.cfg.xml 主配置
Hibernate.cfg.xml
主配置文件夾中主要配置:數據庫鏈接配置,其他參數配置,映射信息等。
常用配置查看源碼:
hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
session-factory 節點: 一般來說一個數據庫對應著一個session-factory節點。
1.數據庫鏈接配置:(以mysql為例子)
hibernate.properties中的對mysql的配置 ## MySQL
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect //上邊的是哪個是mysql下的小版本,我們一般用哪個第一個就可以。
#hibernate.connection.driver_class com.mysql.jdbc.Driver //驅動配置
#hibernate.connection.url jdbc:mysql:///test //鏈接url配置
#hibernate.connection.username gavin //用戶名
#hibernate.connection.passwor //密碼
<!-- 表示我們鏈接的驅動 ,當然也可以采用c3p0連接池--> <property name="hibernate.connection.driver_class">com.jdbc.mysql.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property> <property name="hibernate.connection.username">yujiaming</property> <property name="hibernate.connection.password">root</property> <!-- 區別不同的sql語言,要告訴本數據庫的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>//註意這裏我使用的和上邊的三個版本的編寫略微有所不同,這裏 都可以 <!--表示是打印數據庫語句 --> <property name="hibernate.show_sql">true</property>
2.其他參數的配置
自動建表:
#hibernate.hbm2ddl.auto create-drop 每次在創建sessionFactory時候執行創建表;當調用sesisonFactory的close方法的時候,刪除表!
#hibernate.hbm2ddl.auto create 每次都重新建表; 如果表已經存在就先刪除再創建
#hibernate.hbm2ddl.auto update 如果表不存在就創建; 表存在就不創建;(我們一般常用這個)
#hibernate.hbm2ddl.auto validate (生成環境時候) 執行驗證: 當映射文件的內容與數據庫
格式化輸出代碼: <!-- 此處 表示格式化我們的語句 -->
<property name="hibernate.format_sql"></property>
映射文件的配置
根元素:<hibernate-mapping>,每一個hbm.xml文件都有唯一的一個根元素,包含一些可選的屬性。
package:表示當前的class默認的包名,可以不寫但是要在class中寫類的全限定名。
<hibernate-mapping package="cn.hhua.test">
2)schema:數據庫schema的名稱
3)catalog:數據庫catalog的名稱
4)default-cascade:默認的級聯風格,默認為none
5)default-access:Hibernate用來訪問屬性的策略
6)default-lazy:指定了未明確註明lazy屬性的Java屬性和集合類,Hibernate會采取什麽樣的默認加載風格,默認為true
7)auto-import:指定我們是否可以在查詢語言中使用非全限定的類名,默認為true,如果項目中有兩個同名的持久化類,則最好在這兩個類的對應的映射文件中配置為false
說白的 如果設置為false 在hql查詢語句中要指明返回類的全限定名。默認即可。
<class>定義類:根元素的子元素,用以定義一個持久化類與數據表的映射關系,如下是該元素包含的一些可選的屬性
註意class其實有好多的屬性可以設置,這裏我們只說開發中會遇到的
1)name:持久化類(或者接口)的Java全限定名,如果這個屬性不存在,則Hibernate將假定這是一個非POJO的實體映射
說白了就是我們要映射的類
2)table:對應數據庫表名
<class table="employee" name="Employee"> //這倆最常用,其他的不怎麽用
3)discriminator-value:默認和類名一樣,一個用於區分不同的子類的值,在多態行為時使用
4)dynamic-update:指定用於UPDATE的SQL將會在運行時動態生成,並且只更新那些改變過的字段
5)dynamic-insert:指定用於INSERT的SQL將會在執行時動態生成,並且只包含那些非空值字段
6)select-before-update:指定HIbernate除非確定對象真正被修改了(如果該值為true),否則不會執行SQL UPDATE操作。在特定場合(實際上,它只在一個瞬時對象關聯到一個新的Session中時執行的update()中生效),這說明Hibernate會在UPDATE之前執行一次額外的SQL SELECT操作,來決定是否應該執行UPDATE
7)where:指定定個附加的SQLWHERE條件,在抓取這個類的對象時會增加這個條件
8)optimistic-lock:樂觀鎖定,決定樂觀鎖定的策略
9)lazy:通過設置lazy="false",所有的延遲加載(Lazy fetching)功能將未被激活(disabled)
<id>定義主鍵
1)name:表示映射類的id屬性
2)type:類型 可以使java的類型也可以是hibernate的類型
3)column:數據庫中主鍵的字段名字
4)unsaved-value:用來標誌該實例是剛剛創建的,尚未保存。可以用來區分對象的狀態
5)class:Hibernate用來訪問屬性值的策略
主鍵的生成策略 identity 自增長(mysql,db2) sequence 自增長(序列), oracle中自增長是以序列方法實現 native 自增長【會根據底層數據庫自增長的方式選擇identity或sequence】 如果是mysql數據庫, 采用的自增長方式是identity 如果是oracle數據庫, 使用sequence序列的方式實現自增長
increment 自增長(會有並發訪問的問題,一般在服務器集群環境使用會存在問題。)
assigned 指定主鍵生成策略為手動指定主鍵的值 uuid 指定uuid隨機生成的唯一的值 foreign (外鍵的方式, one-to-one講) |
單個字段作為主鍵的實例:
<id name="empId" column="id">
<generator class="native" />
</id>
<property>普通字段的配置
主要的屬性有:
name 指定對象的屬性名稱
column 指定對象屬性對應的表的字段名稱,如果不寫默認與對象屬性一致。
length 指定字符的長度, 默認為255
type 指定映射表的字段的類型,如果不指定會匹配屬性的類型
java類型: 必須寫全名
hibernate類型: 直接寫類型,都是小寫。
例如:
<property name="empName" column="empName" type="java.lang.String" length="20"></property> <property name="workDate" type="java.util.Date"></property> <!-- 如果列名稱為數據庫關鍵字,需要用反引號或改列名。 --> <property name="desc" column="`desc`" type="java.lang.String"></property>//desc是一個關鍵字,用於排序
其他常用(了解即即可):
lazy:指定實例變量第一次被訪問時,這個屬性是否延遲抓取,默認為false。
unique:使用DDL為該字段添加唯一的約束,此外,這也可以用做property-ref的目標屬性。
not-null:使用DDL為該字段添加可否為空的約束。
access:Hibernate用來訪問屬性值的策略。
access屬性用來讓你控制Hibernate如何在運行時訪問屬性。默認情況下,Hibernate會使用屬性的get/set方法對。如果你指明access="field",則Hibernate會忽略get/set方法對,直接使用反射來訪問成員變量。
<composite-id>復合主鍵
復合主鍵其實就是一組字段例如(姓名+地址)組合成的主鍵
使用步驟:
1. 我們要定義一個主鍵的類,然後將其中的主鍵組成字段定義成類的屬性(我們以地址和姓名為主鍵為例)
// 復合主鍵類 public class CompositeKeys implements Serializable{ private String userName; private String address; // .. get/set } //-------------------------------------------------- //我們在具體的類中只需要引用主鍵就可以 public class User { // 名字跟地址,不會重復 private CompositeKeys keys; private int age; }
2.配置符合主鍵的映射關系
<!-- 復合主鍵映射 --> <composite-id name="keys"> <key-property name="userName" type="string"></key-property> <key-property name="address" type="string"></key-property> </composite-id>
初識Hibernate的主配置和映射配置