關係數據庫學最重要的一個理論就是:不要給關鍵字賦予任何業務意義。由於只要賦予了業務意義,就有可能發生改變,將會爲之後的數據庫維護形成很是大的開銷。 java
一、hibernate應用步驟 sql
在java應用中,使用hibernate包括4步: 數據庫
1)建立hibernate配置文件:hibernate-configuartion app
2)建立實體類 分佈式
3)建立對象/關係映射文件:hibernate-mapping 函數
4)使用hibernate API編寫訪問數據庫代碼 spa
1.1 建立hibernate配置文件 hibernate
hibernate配置文件有兩種格式,一種是properties格式,一種是xml格式。hibernate配置文件放置在java應用的classpath中。 xml
1.2 建立實體類 對象
建立的實體類要符合javaBean規範;hibernate不要求實體類必定要實現Serializable接口,可是若是採用分佈式結構,java類要在不一樣進程間傳遞,須要要求實現該接口;hibernate要求持久化類必須實現一個帶空參數的構造函數。
二、hibernate關係映射
2.1 訪問級別
Java應用程序不能訪問private類型的getXXX()和setXXX()方法,可是hibernate沒有此限制,它可以訪問任何訪問級別的getXXX()和setXXX()方法。
2.2 基本類型屬性和包裝類型屬性
hibernate既支持包裝類型(如Long,Integer),也支持基本類型。對於持久化類的OID,推薦使用包裝類型。這樣能夠經過持久化類的OID是否爲空,判斷持久化類的狀態。
2.3 hibernate訪問持久化類屬性的策略
在<property>元素中的access屬性用於指定hibernate訪問持久化類的屬性的策略,有兩個值:
1)property:默認值。須要有相應的set方法和get方法。
2)field:當沒有set方法或者get方法時指定該值,讓hibernate直接訪問屬性。
2.4 在持久化類的訪問方法中加入程序邏輯
1)在get方法和set方法中加入程序邏輯
例子:
public class Customer{
private String firstName;
private String lastName;
public Customer(){
}
public String getName(){
return firstName + 「 「 + lastName;
}
public void setName(String name){
StringTokenizer toker = new StringTokenizer(name);
firstName= toker.nextToken();
lastName = toker.nextToken();
}
}
create table Customer(
id long not null primary key,
name varchar(100) not null
)
在以上的例子中,Customer類只有firstName和lastName屬性,沒有name屬性,而數據庫中只有name字段。因此在 hibernate-mapping中應該使用<property name=」name」 column=」name」/>進行映射。而且在HQL語句中,只能用name做爲查詢條件,而不能firstName和lastName做爲查詢 條件。
2)控制insert語句和update語句
<property>和<class>元素中的屬性能夠控制insert語句和update語句,主要包括:
a)<property>中的insert:默認爲true,若是爲false,在生成的insert語句中不包含該字段,代表該字段永遠不能爲插入。
b)<property>中的update:默認爲true,若是爲false,在生成的update語句中不包含該字段,代表該字段永遠不能爲更新。
c)<class>中的mutable:默認爲true,若是爲false,默認全部<property>中的update爲false。
d)<property>中的dynamic-insert:默認爲false。若是爲true,只有當該字段值不爲null,纔會把他包含在自動生成的insert語句中。
e)<property>中的dynamic-update:默認爲false。若是爲true,只有當該字段值不爲null,纔會把它包含在生成的update語句中。
f)<class>中的dynamic-insert:默認爲false。
g)<class>中的dynamic-update:默認爲false
hibernate生成動態sql的開銷很小,因此若是表中包含不少字段,建議將dynamic-insert和dynamic-update字段都設置爲true,減小數據庫執行sql語句的開銷。