日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate 基础学习

發(fā)布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate 基础学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

Hibernate

.是什么:

??? Hibernate是輕量級的ORM框架。

??? 1.ORM(ORMapping)

Object

Relation DB

Mapping

JDBC

?

?????? Hibernate做的就是中間的部分

??? ?????? ?Application程序面向的是Object,操作的是Object,所以要吧DB中的數(shù)據(jù)映射成 Object它才能使用

?????? 2.ObjectRDB之間映射關系的特點(Hibernate)

?????? ? (1)類跟表相對應? (UserModel對應于tbl_user)

?????? ? (2)類的屬性跟表的字段相對應

?????? ? (3)類的實例與表中具體的一條記錄相對應

????? (4)一個類可以對著多個表,一個表也可以對應對個類

????? (5)DB中的表可以沒有主鍵,但是Object中必須設置主鍵作為PK字段,不為空且唯一。所以DBObject并不是一一映射的

???????(6)外鍵:DB中表與表之間的關系映射成為Object之間的關系。

??????? (7)table中字段的個數(shù)和名稱可以和Object中定義的不一樣,在部署連接文件中將兩者連接起來即可

.能干什么?

?????? Hibernate不僅僅管理java類到數(shù)據(jù)庫表的映射,還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時人工使用SQLJDBC數(shù)據(jù)處理的時間。

.有什么?

SessionFactory

???? 針對單個數(shù)據(jù)庫映射經(jīng)過編譯后的內(nèi)存對象,是線程安全的。他是生成Session的工廠

Session

???? 表示應用程序與持久層之間交互操作的一個單線程對象。

持久化對象

???? 帶有持久化狀態(tài)的,具有業(yè)務功能的單線程對象。

瞬時及托管對象

???? 那些沒有與session關聯(lián)的持久化類實例。

事務Transaction

???? 應用程序用來指定原子操作單元范圍的對象。

ConnectionProvider連接池

???? 生成JDBC連接的工廠。

TransactioinFactory

???? 生成Transaction對象實例的工廠。

?.怎么用?

? 1.構建環(huán)境(建工程引包)

? 2.modeltable

? 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規(guī)范是通過服務器來實現(xiàn)的

?*Hibernate 幫助我們做的是數(shù)據(jù)庫中數(shù)據(jù)的持久化。

? 我們要做的是 Object(App)? Table(DB)? Client(App)? xml(Hibernate)

????? ?*Blob存儲多大4G的非結構化二進制數(shù)據(jù)

? Clob用來存儲多大4G的字符數(shù)據(jù)

?

第三部分? JDBC連接

.? *.cfg.xmlJDBC連接最重要的設置

?????? <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事務實現(xiàn)機制時用。

?????? ? 事務策略配置有三個標準的選擇:

?????? ? org.hibernate.transaction.JDBCTransactionFactory? 授權給數(shù)據(jù)庫事務

? ??? ??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.四條主要規(guī)則

?????? ??? 實現(xiàn)一個默認的(即無參數(shù)的)構造方法(constructor

????????? 提供一個標識屬性(identifier property

????? ??? 使用非final的類

????????? 為持久化字段聲明訪問器(accessors)和是否可變的標志(mutators)

????????????? 2.?實現(xiàn)繼承(Inheritance

????????????? 3.?實現(xiàn)equals()hashCode()

????????????? 4. Hibernate也支持動態(tài)模型 (在運行期使用MapMap)和象DOM4J的樹模型那樣的實體表示。使用這種方法,你不用寫持久化類,只寫映射文件就行了。

?

第五章 Basic O/R Mapping

.

?????? 1.hibernate-mapping

???????????????????? <hibernate-mapping schema="schemaName"? default-cascade="cascade_style"? default-lazy="true|false" />

?schema (可選): 數(shù)據(jù)庫schema的名稱。

?default-cascade (可選 - 默認為 none): 默認的級聯(lián)風格。

?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 (可選 - 默認是類的非全限定名): 對應的數(shù)據(jù)庫表名。

dynamic-update (可選, 默認為 false): 指定用于UPDATE SQL將會在運行時 動態(tài)生成,并且只更新那些改變過的字段。

dynamic-insert (可選, 默認為 false): 指定用于INSERT SQL 將會在運行時動態(tài) 生成,并且只包含那些非空值字段。

optimistic-lock(樂觀鎖定)(可選,默認是version): 決定樂觀鎖定的策略。

lazy (可選): 通過設置lazy="false" 所有的延遲加載(Lazy fetching)功能將被全部禁用(disabled)。

??????????? 如果你打開了dynamic-update,你可以選擇幾種樂觀鎖定的策略:

????????????? ?????? version(版本檢查) 檢查version/timestamp字段

????????????? ?????? all(全部) 檢查全部字段

????????????? ?????? dirty(臟檢查)只檢察修改過的字段

????????????? ?????? none(不檢查)不使用樂觀鎖定

?????? 3. id

被映射的類必須定義對應數(shù)據(jù)庫表主鍵字段。大多數(shù)類有一個JavaBeans風格的屬性,為每一個實例包含唯一的標識。<id> 元素定義了該屬性到數(shù)據(jù)庫表主鍵字段的映射。

????????????? <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 (可選 - 默認為屬性名字): 對應的數(shù)據(jù)庫字段名。 也可以通過嵌套的<column>元素指定。

type (可選): 一個Hibernate類型的名字。

?

第十章 與對象共事

1. Hibernate對象狀態(tài)(object states)

????????????? 瞬時(Transient) - new操作符創(chuàng)建,且尚未與Hibernate Session 關聯(lián)的對象被認定為瞬時(Transient)的。

????????????? 持久(Persistent) - 持久(Persistent)的實例在數(shù)據(jù)庫中有對應的記錄,并擁有一個持久化標識(identifier)

????????????? 脫管(Detached) - 與持久(Persistent)對象關聯(lián)的Session被關閉后,對象就變?yōu)槊摴?/span> (Detached)的。

2. 裝載對象

????????????? loadget

????????????? 區(qū)別:

???????????????????? a.load先查內(nèi)存,有就用,沒有再查數(shù)據(jù)庫。Get直接查數(shù)據(jù)庫。

???????????????????? b.查數(shù)據(jù)庫沒有之后,load報例外,get返回null

?????? 3.?修改持久對象

load出對象,在對其作修改,然后調(diào)用flush()

4.?修改脫管(Detached)對象

Hibernate通過提供Session.update()Session.merge()重新關聯(lián)脫管實例的辦法來支持這種模型。

5. 自動狀態(tài)檢測

?????? Hibernate的用戶曾要求一個既可自動分配新持久化標識(identifier)保存瞬時(transient)對象,又可更新/重新關聯(lián)脫管(detached)實例的通用方法。 saveOrUpdate()方法實現(xiàn)了? 這個功能。

6. 使用Session.delete()會把對象的狀態(tài)從數(shù)據(jù)庫中移除。

7.拼接hql字符串進行查詢


*Hinbernate中的緩存問題

一、一級緩存

???一級緩存的生命周期和session的生命周期一致,當前sessioin一旦關閉,一級緩存就消失,因此一級緩存也叫session級的緩存或事務級緩存,一級緩存只存實體對象的 ,它不會緩存一般的對象屬性(查詢緩存可以),即當獲得對象后,就將該對象的緩存起來,如果在同一session中如果再去獲取這個對象時,它會先判斷緩存中有沒有該對象的ID,如果有就直接從緩存中取出,反之則去數(shù)據(jù)庫中取,取的同時將該對象的緩存起來,有以下方法可以支持一級緩存:

??????????? ?* get()

???????????? ?* load()

???????????? ?* iterate(查詢實體對象)

???????? ? 其中 Query Criterialist() 只會緩存,但不會使用緩存(除非結合查詢緩存)。

?

二、二級緩存

??二級緩存也稱進程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享,二級緩存的生命周期和SessionFactory的生命周期一致。hibernate為實現(xiàn)二級緩存,只提供二級緩存的接口供第三方來實現(xiàn)。二級緩存也是緩存實體對象 ,其實現(xiàn)原理與一級緩存的差不多吧,其方法與一級的相同,只是緩存的生命周期不一樣而已:

???* get()

???* load()

???* iterate(查詢實體對象)

其中 Query Criterialist() 只會緩存,但不會使用緩存(除非結合查詢緩存)。

???? 什么樣的數(shù)據(jù)適合存放到第二級緩存中?

1、很少被修改的數(shù)據(jù)

2、不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)

3、不會被并發(fā)訪問的數(shù)據(jù)

4、參考數(shù)據(jù)

??不適合存放到第二級緩存的數(shù)據(jù)?

1、經(jīng)常被修改的數(shù)據(jù)

2、財務數(shù)據(jù),絕對不允許出現(xiàn)并發(fā)

3、與其他應用共享的數(shù)據(jù)。

?

*各種控制的流程

???? 1.save(model)

???? to→po

???? 事務判斷要不要提交。我們寫了t.commit(),他才會瓶sql往下走。

???? 通過po得到一個全路徑拼出model.hbm.xml,到.cfg.xml中找到hbm.xml。

???? 動態(tài)拼sql。

???? 得到連接。

???? 執(zhí)行JDBC

?

???? 2.update(model)? 注意:dynamic-update只生成改過的字段

???? to→po(dynamic-updatehuixian load一遍

???? t.commit

???? po找到model.hbm.xml

???? 拼sql

???? 得到連接

???? 執(zhí)行JDBC

(merge其實是借用po的表,裝to,因為session實力池中相同主鍵的實例只有一個)

???? ?3.get(model類,主鍵值;)(雙主鍵時,傳一個封裝雙主鍵的主鍵類)

???? 依據(jù)model類找到model.hbm.xml

???? 動態(tài)拼sql

???? 執(zhí)行sqlrs

???? rs→類實例(反射技術)

??????????? load(model類,主鍵值;)在以上步驟前加一步:在內(nèi)存中查找

???? 4.query

???? 詞法分析(HQL)得到類名

???? 類名→model.hbm.xml

???? 動態(tài)拼sql

???? 會有兩個結果:

?????????? ????????????? object[]

?????????? ????????????? ②各個類實例的集合

???? 返回若cfg.xml中兩個model名稱相同,路徑不同,則在xml中的類名部分要是全路徑

轉載于:https://my.oschina.net/adwangxiao/blog/78600

總結

以上是生活随笔為你收集整理的hibernate 基础学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。