佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > jsp Hibernate 函數(shù)簡介

jsp Hibernate 函數(shù)簡介

熱門標(biāo)簽:電子圍欄 團(tuán)購網(wǎng)站 服務(wù)器配置 Linux服務(wù)器 科大訊飛語音識(shí)別系統(tǒng) 阿里云 Mysql連接數(shù)設(shè)置 銀行業(yè)務(wù)

1、Configuration/SessionFactory/Session
Configuration實(shí)例代表了一個(gè)應(yīng)用程序中Java類型 到SQL數(shù)據(jù)庫映射的完整集合. Configuration被用來構(gòu)建一個(gè)(不可變的 (immutable))SessionFactory.
SessionFactory是線程安全的,創(chuàng)建代價(jià)很高。
Session是非線程安全的,輕量級(jí)的。一個(gè)Session對(duì)應(yīng)一個(gè)JDBC連接,
Session的connection()會(huì)獲取Session與之對(duì)應(yīng)的數(shù)據(jù)庫連接Connection對(duì)象。
Session的功能就是操作對(duì)象的,這些對(duì)象和數(shù)據(jù)庫表有映射關(guān)系。
Session操作的對(duì)象是有狀態(tài)的,分三類:
自由狀態(tài)(transient): 未持久化,未與任何Session相關(guān)聯(lián),數(shù)據(jù)庫表中沒有對(duì)應(yīng)的記錄。
持久化狀態(tài)(persistent): 與一個(gè)Session相關(guān)聯(lián),對(duì)應(yīng)數(shù)據(jù)庫表中一條記錄。
游離狀態(tài)(detached): 已經(jīng)進(jìn)行過持久化,但當(dāng)前未與任何Session相關(guān)聯(lián),數(shù)據(jù)庫表中曾經(jīng)有一條記錄,現(xiàn)在還有沒有就不知道了。
游離狀態(tài)的實(shí)例可以通過調(diào)用save()、persist()或者saveOrUpdate()方法進(jìn)行持久化。持久化實(shí)例可以通過調(diào)用 delete()變成游離狀態(tài)。通過get()或load()方法得到的實(shí)例都是持久化狀態(tài)的。游離狀態(tài)的實(shí)例可以通過調(diào)用 update()、0saveOrUpdate()、lock()或者replicate()進(jìn)行持久化。游離或者自由狀態(tài)下的實(shí)例可以通過調(diào)用merge()方法成為一個(gè)新的持久化實(shí)例。
2、Session的save()/persist()/update()/saveOrUpdate()/merge()/delete()方法
save()方法將指定對(duì)象保存,插入表中一條數(shù)據(jù);
persist()方法將指定對(duì)象保存,插入表中一條數(shù)據(jù),我還沒發(fā)現(xiàn)它和save方法有什么特別之處。
replicate()方法完全使用給定對(duì)象各個(gè)屬性的值(包括標(biāo)識(shí)id)來持久化給定的游離狀態(tài)(Transient)的實(shí)體,很暴力啊,其中還需要指定存儲(chǔ)模式(有四種保存策略供選擇)。
update()方法將指定對(duì)象更新,更新表中一條數(shù)據(jù);
saveOrUpdate()方法接收一個(gè)實(shí)體對(duì)象,根據(jù)實(shí)體對(duì)象的id判斷是否已經(jīng)存在進(jìn)行保存或更新操作,這樣保存和更新方法就統(tǒng)一了;
merge()方法將給定的對(duì)象的狀態(tài)復(fù)制到具有相同標(biāo)識(shí)的持久化對(duì)象上。
delete()方法將指定對(duì)象刪除,刪除表中一條數(shù)據(jù);
特別注意:為了使用saveOrUpdate()方法,在由定義映射文件時(shí),通過設(shè)定id>標(biāo)簽的unsaved-value="null"來判斷執(zhí)行什么操作: 當(dāng)id屬性等于unsaved-value的值(在此為null)時(shí),則認(rèn)為還沒有保存,應(yīng)該執(zhí)行保存操作,否則執(zhí)行更新操作。這樣設(shè)定之后,可以使用saveOrUpdate()方法來統(tǒng)一保存和更新的方法。
id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
generator class="native"/>
/id>
unsaved-value可以設(shè)定的值有四個(gè):
any:總是儲(chǔ)存
none:總是更新
null:id為null時(shí)儲(chǔ)存(預(yù)設(shè))
valid:id為null或是指定值時(shí)儲(chǔ)存
3、Session的get()/load()方法
get()方法會(huì)總是查詢實(shí)體對(duì)象,不存在時(shí)候返回null;
load()方法也是獲取一個(gè)實(shí)體對(duì)象,不存在時(shí)候拋空指針異常。
4、Session的clear()/evict()方法
clear()方法清除Session級(jí)別緩存中的所有實(shí)體(包括各種狀態(tài))對(duì)象,目的是釋放內(nèi)存。
evict()方法清除Session級(jí)別緩存中的指定的實(shí)體(包括各種狀態(tài))對(duì)象。
當(dāng)然,Session關(guān)閉后,這些緩存也就不存在了,會(huì)等待JVM回收。
5、Session的flush()方法
flush()強(qiáng)制持久化Session緩存中的實(shí)體對(duì)象。一般還會(huì)調(diào)用clear()或evict(),目的是趕緊保存,釋放寶貴內(nèi)存資源。
6、Session的commit()/rollback()方法
commit()方法用于提交Session上的事務(wù),否則工作單元不會(huì)對(duì)數(shù)據(jù)庫產(chǎn)生影響。如果執(zhí)行出現(xiàn)異常(也就是commit()失敗了),則之前的操作取消,執(zhí)行rollback()可撤消之前的操作。
7、Session的close()/isOpen()/isConnected()/reconnect()方法
close()方法關(guān)閉Session所對(duì)應(yīng)數(shù)據(jù)庫連接,與其相關(guān)聯(lián)的對(duì)象生命周期結(jié)束。
isOpen()方法檢查Session是否仍然打開,如果Session已經(jīng)斷開,則可以使用reconnect(Connection connection)來重新讓Session關(guān)聯(lián)一個(gè)JDBC連接。
isConnected()方法檢查當(dāng)前Session是否處于連接狀態(tài)。
8、Criteria、DetchedCriteria和Query接口
Criteria和Query的實(shí)例都是和Session綁定的,其生命周期跟隨著Session結(jié)束而結(jié)束。
DetchedCriteria實(shí)例相當(dāng)于一個(gè)SQL模板,目的是為了復(fù)用。其中的getExecutableCriteria(session)方法接收一個(gè)Session對(duì)象,并與之綁定,返回一個(gè)Criteria對(duì)象。
9、Hibernate類的initialize()方法
initialize()方法強(qiáng)制Hibernate立即加載指定實(shí)體所關(guān)聯(lián)的對(duì)象和集合。Hibernate類中還有其他幾個(gè)很有用但不適很常用的方法。
10、映射文件中的lazy屬性
在Hibernate3中,class元素的lazy屬性默認(rèn)是true,如果不需要,則需要顯示指定為lazy="false",否則,操作load返回的對(duì)象會(huì)拋異常。另外Hibernate3中還可以為實(shí)體屬性指定lazy屬性。
11、JDBC事務(wù)和JTA事務(wù)
Hibernate本身沒有事務(wù)管理功能,它依賴于JDBC或JTA的事務(wù)管理功能,在Hibernate配置文件中,如果不顯式指定Transaction的工廠類別屬性hibernate.transaction.factory_class的配置,則默認(rèn)為JDBC事務(wù):
property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory/property>。
在通過SessionFactory獲取到Session后,與Session相關(guān)聯(lián)的JDBC Connection實(shí)例就被設(shè)定為false。
特別注意:如果數(shù)據(jù)庫不支持事務(wù),比如MySQL的MyISAM引擎的表就不支持事務(wù),聲明事務(wù)也不會(huì)起作用。要使MySQL5的表支持事務(wù),則可以指定表的引擎類型為InnoDB。如果是學(xué)習(xí)或者研究,目前最好還是使用PostgreSQL 8.3或DB2、Oracle。
JDBC事務(wù)總是和一個(gè)數(shù)據(jù)庫連接(或一個(gè)Session)相關(guān)聯(lián)的。
JTA事務(wù)則可以跨越多個(gè)數(shù)據(jù)連接(或多個(gè)Session),這些連接還可以是不同數(shù)據(jù)庫的連接,JTA事務(wù)一般由容器進(jìn)行管理。編程只要在多個(gè)操作單元的開始和結(jié)束定義JTA事務(wù)的邊界即可。
特別注意:如果使用了JTA事務(wù),則不能再用在JDBC式的事務(wù)來管理每個(gè)Session的操作,否則會(huì)出錯(cuò)。為了程序的的通用性,一般來說,都是使用JTA事務(wù)來構(gòu)建應(yīng)用,這使用任何環(huán)境。當(dāng)然,也可以使用事務(wù)代理為每個(gè)JDBC的操作方法加入事務(wù)控制。這樣也為程序以后移植到JTA容器事務(wù)上帶來很大方便。其實(shí)現(xiàn)在可以使用Spring的事務(wù)管理,與Hibernate結(jié)合的非常完美。


PS:persist()方法無返回值,save()方法返回對(duì)象標(biāo)識(shí)符。
persist()方法只能保存暫態(tài)和持久態(tài)的對(duì)象,save()方法能保存任何狀態(tài)對(duì)象。
共同點(diǎn):調(diào)用完方法后,對(duì)象的狀態(tài)都變成持久態(tài)。
get()方法返回對(duì)象的實(shí)例,而對(duì)于load()方法,如果在持久化上下文存在該標(biāo)識(shí)符的對(duì)象,就返回該對(duì)象的實(shí)例,否則返回對(duì)象的代理,該代理對(duì)象只含有對(duì)象標(biāo)識(shí)符。

使用get或load要小心
load可以提高緩存使用效率 但由于是代理 所以在后面操作會(huì)更容易出現(xiàn)問題
get是直接訪問db 所以cache的作用就沒了 但會(huì)馬上得到結(jié)果 麻煩少,但頻繁調(diào)用勢(shì)必對(duì)服務(wù)器壓力增加

您可能感興趣的文章:
  • JSP 開發(fā)之hibernate的hql查詢多對(duì)多查詢
  • JSP 開發(fā)之hibernate配置二級(jí)緩存的方法
  • JSP開發(fā)中hibernate框架的常用檢索方式總結(jié)
  • JSP 中Hibernate實(shí)現(xiàn)映射枚舉類型
  • jsp Hibernate批量更新和批量刪除處理代碼
  • jsp Hibernate入門教程
  • jsp hibernate 數(shù)據(jù)保存操作的原理
  • jsp hibernate的分頁代碼
  • JSP開發(fā)之hibernate之單向多對(duì)一關(guān)聯(lián)的實(shí)例

標(biāo)簽:大理 衡水 棗莊 江蘇 萍鄉(xiāng) 廣元 蚌埠 衢州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《jsp Hibernate 函數(shù)簡介》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    浦县| 元江| 山西省| 芒康县| 游戏| 桑日县| 民县| 阜康市| 珲春市| 玉田县| 青州市| 临西县| 克拉玛依市| 朔州市| 天全县| 许昌市| 聂拉木县| 塔河县| 呈贡县| 巫溪县| 百色市| 惠州市| 华池县| 樟树市| 曲周县| 盐城市| 彭山县| 建昌县| 浠水县| 新乡市| 雷州市| 海伦市| 连江县| 古浪县| 兰西县| 吴桥县| 罗田县| 三门峡市| 图木舒克市| 新津县| 罗田县|