Hibernate.cfg.xmljava
主配置文件夾中主要配置:數據庫連接配置,其餘參數配置,映射信息等。mysql
經常使用配置查看源碼:sql
hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties數據庫
session-factory 節點: 通常來講一個數據庫對應着一個session-factory節點。
服務器
1.數據庫連接配置:(以mysql爲例子)session
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.其餘參數的配置oracle
自動建表:app
#hibernate.hbm2ddl.auto create-drop 每次在建立sessionFactory時候執行建立表;當調用sesisonFactory的close方法的時候,刪除表!ide
#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>