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
首先是須要加入4個jar包: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定義的字段,就是當前類的主鍵.