hibernate 基础学习
2019獨角獸企業重金招聘Python工程師標準>>>
Hibernate
一.是什么:
??? Hibernate是輕量級的ORM框架。
??? 1.ORM(ORMapping)
| Object |
| Relation DB |
| Mapping |
| JDBC |
?????? Hibernate做的就是中間的部分
??? ?????? ?Application程序面向的是Object,操作的是Object,所以要吧DB中的數據映射成 Object它才能使用
?????? 2.Object與RDB之間映射關系的特點(Hibernate中)
?????? ? (1)類跟表相對應? (UserModel對應于tbl_user)
?????? ? (2)類的屬性跟表的字段相對應
?????? ? (3)類的實例與表中具體的一條記錄相對應
????? (4)一個類可以對著多個表,一個表也可以對應對個類
????? (5)DB中的表可以沒有主鍵,但是Object中必須設置主鍵作為PK字段,不為空且唯一。所以DB跟Object并不是一一映射的
???????(6)外鍵:DB中表與表之間的關系映射成為Object之間的關系。
??????? (7)table中字段的個數和名稱可以和Object中定義的不一樣,在部署連接文件中將兩者連接起來即可
二.能干什么?
?????? Hibernate不僅僅管理java類到數據庫表的映射,還提供數據查詢和獲取數據的方法,可以大幅度減少開發時人工使用SQL和JDBC數據處理的時間。
三.有什么?
SessionFactory
???? 針對單個數據庫映射經過編譯后的內存對象,是線程安全的。他是生成Session的工廠
Session
???? 表示應用程序與持久層之間交互操作的一個單線程對象。
持久化對象
???? 帶有持久化狀態的,具有業務功能的單線程對象。
瞬時及托管對象
???? 那些沒有與session關聯的持久化類實例。
事務Transaction
???? 應用程序用來指定原子操作單元范圍的對象。
ConnectionProvider連接池
???? 生成JDBC連接的工廠。
TransactioinFactory
???? 生成Transaction對象實例的工廠。
?四.怎么用?
? 1.構建環境(建工程引包)
? 2.建model建table
? 3.做配置文件
Hibernate文件分為兩類?????? ***.cfg.xml????? ***.hbm.xml
??? ??? ??? ***.cfg.xml? :
? ? ? ?? ? a.缺省名稱為 hibernate.cfg.xml
???????????b.存放在當前classes的根目錄下
??????????? c.有如下四部分配置與DB連接
????????????? 可選配置(dialect)?? 資源文件注冊 (hbm.xml)? 二級緩存
??? ??? ??? ***.hbm.xml
???? ??? ??? a.與被描述的類同名? UserModel.hbm.xml
?????????????b.存放位置必須與所描述類存放在同一文件夾下
????????????? c.四部分配置類和表的映射
??????????????????????????????? 主鍵的映射
??????????????????????????????? 類的屬性和DB中字段的映射
??????????????????????????????? 關系的映射
?*類中默認的cfg.xml文件是hibernate.cfg.xml若改變名稱,在類中使用時要指出
?? new Configuration().configure(“cc.cfg.xml”).buildSessionFactory;
?*標準的JEE規范是通過服務器來實現的
?*Hibernate 幫助我們做的是數據庫中數據的持久化。
? 我們要做的是 Object(App中)? Table(DB中)? Client(App中)? xml(Hibernate)
????? ?*Blob存儲多大4G的非結構化二進制數據
? Clob用來存儲多大4G的字符數據
?
第三部分? JDBC連接
一.? *.cfg.xml中JDBC連接最重要的設置
?????? <property name=”connection.driver.class”>……..</property>
<property name=”connection.url”>……..</property>
<property name=”connection.userName”>……..</property>
<property name=”connection.password”>……..</property>
?二.可選的配置屬性
?????? 1.<property? name=”dialect”>org.hibernate.dialect.Oracle9iDialect</property>(必選的)
?????? 2.<property? name=”show-sql”>true</property>
?????? 3.hibernate.connection.isolation設置JDBC事務隔離級別(建議選)
?????? 4.hibernate.transaction.factory-class想改變hibernate事務實現機制時用。
?????? ? 事務策略配置有三個標準的選擇:
?????? ? org.hibernate.transaction.JDBCTransactionFactory? 授權給數據庫事務
? ??? ??org.hibernate.JTATransactionFactory? JTA能做分布事務
?????? ? org.hibernate.transaction. CMTransactionFactory
5.jta.userTransaction 若四中選擇的是JTA則這個必須選擇
6.hibernate.hbmzddl.auto? 自動生成表
?
三.JEE應用程序服務器的集成
????? 1.container-managerd datasource:Hibernate能使用通過容器管理,并有JNDI提供的JDBC 連接
2.自動JNDI綁定:Hibernate可以將SessionFactory綁定到JNDI
3.JTAsession綁定:HibernateSession 可以自動綁定到JTA事務作用的范圍,只需簡單的從JNDI中查找sessionFactory并獲得當前的Session
4.JMX部署
?第四章 Persistence Class
?一.POJO
????????????? 1.四條主要規則
?????? ??? 實現一個默認的(即無參數的)構造方法(constructor)
????????? 提供一個標識屬性(identifier property)
????? ??? 使用非final的類
????????? 為持久化字段聲明訪問器(accessors)和是否可變的標志(mutators)
????????????? 2.?實現繼承(Inheritance)
????????????? 3.?實現equals()和hashCode()
????????????? 4. Hibernate也支持動態模型 (在運行期使用Map的Map)和象DOM4J的樹模型那樣的實體表示。使用這種方法,你不用寫持久化類,只寫映射文件就行了。
?
第五章 Basic O/R Mapping
一.
?????? 1.hibernate-mapping
???????????????????? <hibernate-mapping schema="schemaName"? default-cascade="cascade_style"? default-lazy="true|false" />
?schema (可選): 數據庫schema的名稱。
?default-cascade (可選 - 默認為 none): 默認的級聯風格。
?default-lazy (可選 - 默認為 true): 指定了未明確注明lazy屬性的Java屬性和集合類,Hibernate會采取什么樣的默認加載風格。
2.Class
<class name="ClassName" table="tableName" dynamic-update="true|false" dynamic-insert="true|false" optimistic-lock="none|version|dirty|all"? lazy="true|false"/>
?name (可選): 持久化類(或者接口)的Java全限定名。 如果這個屬性不存在, Hibernate將假定這是一個非POJO的實體映射。
table (可選 - 默認是類的非全限定名): 對應的數據庫表名。
dynamic-update (可選, 默認為 false): 指定用于UPDATE 的SQL將會在運行時 動態生成,并且只更新那些改變過的字段。
dynamic-insert (可選, 默認為 false): 指定用于INSERT的 SQL 將會在運行時動態 生成,并且只包含那些非空值字段。
optimistic-lock(樂觀鎖定)(可選,默認是version): 決定樂觀鎖定的策略。
lazy (可選): 通過設置lazy="false", 所有的延遲加載(Lazy fetching)功能將被全部禁用(disabled)。
??????????? 如果你打開了dynamic-update,你可以選擇幾種樂觀鎖定的策略:
????????????? ?????? version(版本檢查) 檢查version/timestamp字段
????????????? ?????? all(全部) 檢查全部字段
????????????? ?????? dirty(臟檢查)只檢察修改過的字段
????????????? ?????? none(不檢查)不使用樂觀鎖定
?????? 3. id
被映射的類必須定義對應數據庫表主鍵字段。大多數類有一個JavaBeans風格的屬性,為每一個實例包含唯一的標識。<id> 元素定義了該屬性到數據庫表主鍵字段的映射。
????????????? <id name="propertyName"? type="typename" column="column_name"></id>
???? name (可選): 標識屬性的名字。
???? type (可選): 標識Hibernate類型的名字。
???? column (可選 - 默認為屬性名): 主鍵字段的名字。
?????? 4. Generator
可選的<generator>子元素是一個Java類的名字, 用來為該持久化類的實例生成唯一的標識。
<id name="id" type="long" column="cat_id">
???????<generator class="org.hibernate.id.TableHiLoGenerator">
??????????????? <param name="table">uid_table</param>
??????????????? <param name="column">next_hi_value_column</param>
???????</generator>
</id>
assigned
讓應用程序在save()之前為對象分配一個標示符。這是 <generator>元素沒有指定時的默認生成策略。
5. <property>元素為類定義了一個持久化的,JavaBean風格的屬性。
<property
???????name="propertyName"
???????column="column_name"
???????type="typename"
?????? />
name: 屬性的名字,以小寫字母開頭。
column (可選 - 默認為屬性名字): 對應的數據庫字段名。 也可以通過嵌套的<column>元素指定。
type (可選): 一個Hibernate類型的名字。
?
第十章 與對象共事
1. Hibernate對象狀態(object states)
????????????? 瞬時(Transient) - 由new操作符創建,且尚未與Hibernate Session 關聯的對象被認定為瞬時(Transient)的。
????????????? 持久(Persistent) - 持久(Persistent)的實例在數據庫中有對應的記錄,并擁有一個持久化標識(identifier)。
????????????? 脫管(Detached) - 與持久(Persistent)對象關聯的Session被關閉后,對象就變為脫管 (Detached)的。
2. 裝載對象
????????????? load和get
????????????? 區別:
???????????????????? a.load先查內存,有就用,沒有再查數據庫。Get直接查數據庫。
???????????????????? b.查數據庫沒有之后,load報例外,get返回null。
?????? 3.?修改持久對象
先load出對象,在對其作修改,然后調用flush();
4.?修改脫管(Detached)對象
Hibernate通過提供Session.update()或Session.merge()重新關聯脫管實例的辦法來支持這種模型。
5. 自動狀態檢測
?????? Hibernate的用戶曾要求一個既可自動分配新持久化標識(identifier)保存瞬時(transient)對象,又可更新/重新關聯脫管(detached)實例的通用方法。 saveOrUpdate()方法實現了? 這個功能。
6. 使用Session.delete()會把對象的狀態從數據庫中移除。
7.拼接hql字符串進行查詢
*Hinbernate中的緩存問題
一、一級緩存
???一級緩存的生命周期和session的生命周期一致,當前sessioin一旦關閉,一級緩存就消失,因此一級緩存也叫session級的緩存或事務級緩存,一級緩存只存實體對象的 ,它不會緩存一般的對象屬性(查詢緩存可以),即當獲得對象后,就將該對象的緩存起來,如果在同一session中如果再去獲取這個對象時,它會先判斷緩存中有沒有該對象的ID,如果有就直接從緩存中取出,反之則去數據庫中取,取的同時將該對象的緩存起來,有以下方法可以支持一級緩存:
??????????? ?* get()
???????????? ?* load()
???????????? ?* iterate(查詢實體對象)
???????? ? 其中 Query 和Criteria的list() 只會緩存,但不會使用緩存(除非結合查詢緩存)。
?
二、二級緩存
??二級緩存也稱進程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享,二級緩存的生命周期和SessionFactory的生命周期一致。hibernate為實現二級緩存,只提供二級緩存的接口供第三方來實現。二級緩存也是緩存實體對象 ,其實現原理與一級緩存的差不多吧,其方法與一級的相同,只是緩存的生命周期不一樣而已:
???* get()
???* load()
???* iterate(查詢實體對象)
其中 Query 和Criteria的list() 只會緩存,但不會使用緩存(除非結合查詢緩存)。
???? 什么樣的數據適合存放到第二級緩存中?
1、很少被修改的數據
2、不是很重要的數據,允許出現偶爾并發的數據
3、不會被并發訪問的數據
4、參考數據
??不適合存放到第二級緩存的數據?
1、經常被修改的數據
2、財務數據,絕對不允許出現并發
3、與其他應用共享的數據。
?
*各種控制的流程
???? 1.save(model)
???? to→po
???? 事務判斷要不要提交。我們寫了t.commit(),他才會瓶sql往下走。
???? 通過po得到一個全路徑拼出model.hbm.xml,到.cfg.xml中找到hbm.xml。
???? 動態拼sql。
???? 得到連接。
???? 執行JDBC。
?
???? 2.update(model)? 注意:dynamic-update只生成改過的字段
???? to→po(dynamic-updatehuixian load一遍)
???? t.commit
???? po找到model.hbm.xml
???? 拼sql
???? 得到連接
???? 執行JDBC
(merge其實是借用po的表,裝to,因為session實力池中相同主鍵的實例只有一個)
???? ?3.get(model類,主鍵值;)(雙主鍵時,傳一個封裝雙主鍵的主鍵類)
???? 依據model類找到model類.hbm.xml
???? 動態拼sql
???? 執行sql的rs
???? rs→類實例(反射技術)
??????????? load(model類,主鍵值;)在以上步驟前加一步:在內存中查找
???? 4.query
???? 詞法分析(HQL)得到類名
???? 類名→model.hbm.xml
???? 動態拼sql
???? 會有兩個結果:
?????????? ????????????? ①object[]
?????????? ????????????? ②各個類實例的集合
???? 返回若cfg.xml中兩個model名稱相同,路徑不同,則在xml中的類名部分要是全路徑
轉載于:https://my.oschina.net/adwangxiao/blog/78600
總結
以上是生活随笔為你收集整理的hibernate 基础学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SIEM市场并购:Sensage被军工企
- 下一篇: 化了妆的祝福 4