Hibernate知識點

1>Hibernate三種狀態:transient(瞬時狀態),persistent(持久化狀態)以及detached(離線狀態)java

2>Hibernate延遲加載:session.get() -> 即時加載 ; session.load();延遲加載;在超出數據庫表中數據查詢的範圍的時候,get方法會拋出空指針異常,load會拋出對象爲空異常web

3>ID生成策略:數據庫

native/autoapi

根據不一樣的數據庫採用不一樣的ID生成方式,例如:在SQL Server中採用identity; 在MySQL中採用auto_increment; 在ORACLE中就會採用sequence, 注意hibernate會自動幫你建立一個名字叫hibernate_sequence的序列,不用本身去建立.這也是最經常使用和省事的.session

 

4>Hibernate註解:app

註解的方式與xml很不少相似:ide

首先是須要加入4jar包:hibernate-commons-annotations.jar  hibernate-annotations.jarfetch

ejb3-persistence.jar  hibernate-jpa-2.0-api-1.0.1.Final.jarui

下面是不一樣的地方:spa

1):hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改成引用實體類:

     即把:<mapping resource="com/wsw/hibernate/model/Person.hbm.xml"/>

改成:<mapping class="com.wsw.hibernate.model.Teacher" />

2):獲取SessionFactory方式發生了變化:

      即:由SessionFactory sf = new Configuration().configure().buildSessionFactory()

    改成:SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory()

3):註解方式不須要在xxx.hbm.xml把實體類與表進行映射。而採用在實體類中進行註解。

注意:1):若是實體類屬性名與表字段名不一致的時候,要麼都註解在屬性前,要麼都註解在get方法前。不能部分註解在屬性前,部分註解在方法前。

 (2若是實體類屬性名與表字段名一致的時候,能夠部分註解在屬性前,部分註解在方法前。

 (3):若是在實體類中某些屬性不註解:(屬性和get都不寫註解),默認爲表字段名與實體類屬性名一致。

 (4):若是實體類的某個成員屬性不須要存入數據庫中,使用@Transient 進行註解就能夠了。即相似於:(xxx.hbm.Xml配置中的某些字段不寫(就是不須要對這個成員屬性進行映射))

 (5):表名稱能夠在實體類前進行註解。

 (6全部這些註解在:javax.persistence包下。而不是在hibernate包中。

 

經常使用的hibernate annotation標籤以下:

@Entity              --註釋聲明該類爲持久類。將一個Javabean類聲明爲一 個實體的數據庫表映射類,最好實現序列化.此時,默認狀況下,全部的類屬性都爲映射到數據表的持久性字段.若在類中,添加另外屬性,而非映射來數據庫的, 要用下面的Transient來註解.


@Table(name="promotion_info")      --持久性映射的表(表名="promotion_info).@Table是類一級的註解,定義在@Entity下,爲實體bean映射表,目錄和schema的名字,默認爲實體bean的類名,不帶包名.


@Id--註釋能夠代表哪一種屬性是該類中的獨特標識符(即至關於數據表的主鍵)。 
@GeneratedValue   --定義自動增加的主鍵的生成策略. 
@Transient             --將忽略這些字段和屬性,不用持久化到數據庫.適用於,在當前的持久類中,某些屬性不是用於映射到數據表,而是用於其它的業務邏輯須要,這時,須將這些屬性進行transient的註解.不然系統會因映射不到數據表相應字段而出錯. 
@Temporal(TemporalType.TIMESTAMP)--聲明時間格式 
@Enumerated         --聲明枚舉 
@Version                --聲明添加對樂觀鎖定的支持 
@OneToOne            --能夠創建實體bean之間的一對一的關聯 
@OneToMany          --能夠創建實體bean之間的一對多的關聯 
@ManyToOne          --能夠創建實體bean之間的多對一的關聯 
@ManyToMany        --能夠創建實體bean之間的多對多的關聯 
@Formula               --一個SQL表達式,這種屬性是隻讀的,不在數據庫生成屬性(可使用sum、average、max等) 
@OrderBy               --Many端某個字段排序(List)

 

Hibernate 可以出色地自動生成主鍵。Hibernate/EBJ 3 註釋也能夠爲主鍵的自動生成提供豐富的支持,容許實現各類策略。
其生成規則由@GeneratedValue設定的.這裏的@id和@GeneratedValue都是JPA的標準用法, JPA提供四種標準用法,由@GeneratedValue的源代碼能夠明顯看出. 
JPA提供的四種標準用法爲TABLE,SEQUENCE,IDENTITY,AUTO. 
TABLE:使用一個特定的數據庫表格來保存主鍵。 
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 
IDENTITY:主鍵由數據庫自動生成(主要是自動增加型) 
AUTO:主鍵由程序控制。

在指定主鍵時,若是不指定主鍵生成策略,默認爲AUTO。 
@Id

至關於

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

 

identity:

使用SQL Server 和 MySQL 的自增字段,這個方法不能放到 Oracle 中,Oracle 不支持自增字段,要設定sequence(MySQL 和 SQL Server 中很經常使用)。

Oracle就要採用sequence了.

 

同時,也可採用uuid,native等其它策略.(相關用法,上網查詢)

在一對多註解中,會用到:

"一"方:
@OneToMany --> mappedBy:"多"方的關聯屬性(被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定義的外鍵字段.

如數據表定義外鍵以下:

FOREIGN KEY (classid) REFERENCES classes(id)

則:

@JoinColumn(name="classid"

在雙向關聯中,有且僅有一端做爲主體(owner)端存在:主體端負責維護聯接列(即更新),對於不須要維護這種關係的從表則經過mappedNy屬性進行聲明。mappedBy的值指向另外一主體的關聯屬性。例子中,mappedBy的值爲classes。

mappedBy至關於過去的inverse="true".
inverse=false的side(side實際上是指inverse=false所位於的class元素)端有責任維護關係,而inverse=true端無須維護這些關係。

 

cascade與fetch使用說明:

Cascade

CascadeType.PERSIST (級聯新建) 
CascadeType.REMOVE  (級聯刪除) 
CascadeType.REFRESH (級聯刷新) 
CascadeType.MERGE   (級聯更新)中選擇一個或多個。 
CascadeType.ALL

 fetch屬性:

關聯關係獲取方式,便是否採用延時加載。
 LAZY(默認值)採用延時加載,查詢數據時,不一塊兒查詢關聯對象的數據。而是當訪問關聯對象時(如:getStudnets()時)才觸發相應的查詢操做,獲取關聯對象數據。
EAGER:是在查詢數據時,也直接一塊兒獲取關聯對象的數據。

多對多註解: 

在多對多註解中,雙方都採用@ManyToMany.

其中被控方,像一對多註解中設置同樣,也要設置mappedBy.

其中主控方,不像一對多註解那樣,採用@joinColumn,而是採用@joinTable.以下:

@JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})

其中,

如上所說,mappedBy,至關於inverse="true".因此,在@joinTable中的inverseJoinColumns中定義的字段爲mappedBy所在類的主鍵.joinColumns定義的字段,就是當前類的主鍵.

相關文章
相關標籤/搜索