hibernate總結

1、簡單介紹:

1) Hibernate是ORM框架之中的一個,該框架包含JDO,TOPLINK,JPA等,hibernate先於JPA出現,hibernate的開發人員參與JPA的開發,當中JPA標準大有一統天下的趨勢。html

2) Hibernate是面向對象的,JDBC是面向過程的。java

3) Hibernate封裝了sql語句。用戶僅僅需定義實體類、創建數據庫。並配置數據庫鏈接(hibernate.cfg.xml),說明實體類與數據庫之間的映射關係(hbm.xml文件或annotation)就可完畢對象的操做。node

4) hibernate的映射兩種方式:xml方式。annotation註解方式(着重掌握)。MyEclipse可以依據反向生成類,註解也可正向生成數據庫。算法

理論上面向對象應該先類後表,但實際工做中。先見表後建類,因爲有些db優化操做註解方式沒法生成。sql

5) Hibernate使用的日誌接口是slf4j。可實現多種日誌,hibernate的日誌slf4j-nodep不常用,可以轉換爲log4j日誌。需要導入:數據庫

slf4j-api.jar和slf4j-log4j12.jar.api

 

 

2、Hibernate.cfg.xml的配置:

1) <property name="current_session_context_class">thread</property>緩存

a. 使用getCurrentSession方法時需要設置。tomcat

b. 取值:性能優化

① thread:上下文:從當前線程中找。

② jta(java transaction api):處理分佈式事務

事務分類:connection事務。jta事務。

Connection事務使用一個connection處理。

jta事務需要多個connection處理。需要事務管理器TransactionManager實現)。如產品訂單。一個數據庫處理產品信息。還有一個數據庫處理支付信息。

運行時需要applicationServer的提供TransactionManager,tomcat不具有TransactionManager。Jboss,WebLogic具有。

 

2) <property name="hbm2ddl.auto">create</property>

① Create:每次本身主動建立表

② Update:字段更新時本身主動建立DDL。更新表。

 

3、基礎配置——主要寫在get方法上。

@Entity註解實體

@Table(name="_animal"):改動表名

@Transient  //不往數據庫中存,瞬態transient的數據。

@Temporal(TemporalType.DATE):改動Date格式

@Id註解主鍵

@Column(name="_name"):改動字段名

@Basic  //默以爲@Basic

 

4、主鍵生成策略

1) xml:generator=」native」

① native:自適應DB

② identity:MySQL。SQLServer自增

③ sequence:Oracle自增

④ uuid:惟一

⑤ asssigned:指定

2) annotation:

① AUTO:至關於xml中native

② IDENTITY:同xml

③ SEQUENCE:同xml

④ TABLE:知道就能夠

 

3) 聯合主鍵:主鍵類需要實現serializable接口。

① 常用方式1:嵌入主鍵類並在get上@EmbeddedId

② 常用方式2:實體類上@IdClass(PersonPK.class),主鍵get方法上@Id

 

5、Hibernate核心開發接口:

1) Configuration(xml方式) & AnnotaionConfiguration(註解方式)

① 管理配置信息:默認名hibernate.cfg.xml

② 用於產生SessionFactory

③ 可以在configure方法中指定hibernate配置文件名

④ 僅僅需關注一個方法: Configuration().configure().buildSessionFactory();

2) SessionFactory:

① 用來獲取和管理Session

② 每個應用一般僅僅需一個,除非要訪問多個數據庫。

③ 關注兩種方法:

a. getCurrentSession():首先查找上下文中的Session,沒有則建立新的Session。commit後session本身主動關閉。

可以實現事務(同一時候成功或同一時候失敗,必須使用同個Session)提交。

b. openSession():老是建立新的session,需要關閉,不建議使用。

 

 

6、對象的三種狀態:

1) Transient:瞬態,內存中有,Session緩存中沒有,數據庫中沒有,沒有ID

2) Persistent:持久態。內存中有。將對象載入到Session緩存中。數據庫有。有ID

3) Detached:託管狀態(Session關閉,緩存也沒了):內存中有。Session緩存中沒,數據庫中有,有ID

 

7、Session的方法:

1) clear():清空Session緩存

2) save();

3) delete();

4) flush():刷新Session緩存

5) get(Student.Class,1):立刻載入Student對象運行SQL語句。對象成爲persistent態,載入到Session緩存中

6) load(Student.Class,1):延遲,生成的是代理對象,用到時纔會運行SQL語句並載入到緩存

7) update:更新對象所有字段。若僅僅想更新部分字段,使用HQL:

8) Query query = session.createQuery("update Student s set s.name='s' where s.id=1");

query.executeUpdate(query);

8、hibernate關係映射(重點)

1) 關係——指的是對象數量之間的關係:一對一,一對多,多對一,多對多。

2) 數據庫表與表之間的關係:僅僅有主外鍵關係。數據庫設計時通常遵循主鍵關聯和單向外鍵關聯。比較清晰。

① 單向OneToOne:

數據庫設計時。假設兩個實體A,B是一對一關係,可以在A中添加B對象的一個引用。並在get方法上寫OneToOne。生成表時就把B表的ID做爲A表的一個外鍵。get上寫@JoinColumn(name=」」)可改動生成的外鍵的字段名。

② 雙向OneToOne:

在B中添加A對象就能夠,get方法上寫@OneToOne  @mappedBy(「」)」」中爲A中getXXX()方法中的xXX。

組件映射:

@Embedded 至關於組件加到了被嵌入對象中。故不需要ID,不需要@Entity不需要在cfg中引入。

③ 單向ManyToOne:(在多的一方添加少的一方的外鍵,在多的一方添加少的一方的對象引用)

通常爲多的一方添加外鍵。

則多的一方添加還有一方的對象引用。get上@ManyToOne就能夠

@JoinColumn(name=」」)指定少的一方外鍵字段名

④ 單向OneToMany:(在多的一方添加少的一方的外鍵。在少的一方添加多的set類型的對象引用)

在少的一方添加set類型的還有一方類型的引用。get上@OneToMany,則默認用ManyToMany的方式,在數據庫中生成一張擁有兩方ID的暫時表。在get上寫@JoinColumn(name=」」)。名稱爲少的一方的外鍵字段名,則生成的數據庫結果跟ManyToOne同樣。

⑤ 雙向OneToMany即ManyToOne:

雙向就用mappedBy=」主導的對象名」。@OneToMany @ManyToOne 

生成的數據庫跟一個單向的同樣。

⑥ 單向ManyToMany:單向設置在當中一個實體類中引入並@ManyToMany就能夠

⑦ 雙向ManyToMany:雙向兩邊都加入實體類並@ManyToMany,mappedBy設置主導一方。

9、性能優化

 

1) 級聯(CASCADE):在添加、刪除等操做時。一併改變和該實體類有關聯的實體。僅僅是操做時比較方便。並不是必要的。

操做:

① 1.在映射關係名後@ManyToMany(cascade={CascadeType.ALL})。設置對象之間的關係。

② 2.如設置Dream和Person之間的關係:dream.setPerson(person);單向設一個。雙向設兩個cascade關聯。

a. ALL,不論何時都級聯。

b. PERSIST,加入時級聯。

c. REMOVE刪除時級聯。

級聯後,保存、刪除一個表中的數據時會本身主動操做級聯的表中的數據。

 

2) 延遲載入/立刻載入(fetch)

級聯僅僅影響添加刪除改動。而fetch影響查詢。

① EAGER:查詢時關聯的表立刻載入。

② LAZY:查詢時關聯的表不載入。

操做:

@ManyToOne(fetch=FetchType.Lazy)就能夠,則在查詢或get。load時改變載入方式。

3) 緩存

① 一級緩存:Session中的緩存

② 二級緩存:SessionFactory中的緩存,當Session中找不到的時候就去二級緩存中找。load,iterator,list查詢 默認使用二級緩存。

③ 查詢緩存:查詢反覆sql語句先在查詢緩存中找。

適合放在二級緩存中的數據:

a. 常常被訪問,

b. 改動不大,

c. 數量有限。

好比:組織機構。帖子類型。用戶權限。

 

4) 事務併發處理:

a. 事務:ACID。原子性,一致性,獨立型,持久性。

① 髒讀:讀了另一個數據沒有提交的數據。

② 不可反覆讀:同一個數據先後讀兩次值不一樣,作了更新。

③ 幻讀:讀數據的過程當中另外的事務向當中插入/刪除一條數據。影響了查詢結果。

b. 事務隔離機制:取值1。2,4。8。

(0001,0010。0100,1000算法效率高,擁有幾種權限如CRUD,可以合併爲0110)。

普通狀況下不處理幻讀,考慮到效率通常設置爲2即read-commited級別。

因此要解決不可反覆讀的問題。

隔離機制

取值

是否會髒讀

是否會不可反覆讀

是否會幻讀

read-uncommited

1

read-commited

2

×

repeatable read

4

×

×

serialzable

8

×

×

×

 

c. 解決不可反覆讀的問題:

樂觀鎖:使用數據庫的鎖

悲觀鎖:使用@version

相關文章
相關標籤/搜索