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
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。更新表。
@Entity:註解實體
@Table(name="_animal"):改動表名
@Transient //不往數據庫中存,瞬態transient的數據。
@Temporal(TemporalType.DATE):改動Date格式
@Id:註解主鍵
@Column(name="_name"):改動字段名
@Basic //默以爲@Basic
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
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,需要關閉,不建議使用。
1) Transient:瞬態,內存中有,Session緩存中沒有,數據庫中沒有,沒有ID
2) Persistent:持久態。內存中有。將對象載入到Session緩存中。數據庫有。有ID
3) Detached:託管狀態(Session關閉,緩存也沒了):內存中有。Session緩存中沒,數據庫中有,有ID
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);
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設置主導一方。
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