溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hibernate/JPA如何使用

發(fā)布時(shí)間:2021-11-03 11:27:20 來源:億速云 閱讀:152 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)Hibernate/JPA如何使用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。



1)和數(shù)據(jù)庫(kù)管理員成為朋友

目前存在一個(gè)趨勢(shì),就是一些Java開發(fā)者忽視數(shù)據(jù)庫(kù)管理員的重要性。這便犯了一個(gè)很大的錯(cuò)誤,對(duì)于要取得任何的ORM(對(duì)象關(guān)系映射)技術(shù)的成功,和數(shù)據(jù)庫(kù)管理員保持一個(gè)良好的工作關(guān)系是至關(guān)重要的。有如下兩個(gè)原因:

單獨(dú)數(shù)據(jù)庫(kù)管理員雖然不能使Hibernate項(xiàng)目成功,但是他們通??梢宰屵@些項(xiàng)目失敗。

數(shù)據(jù)庫(kù)管理員對(duì)數(shù)據(jù)庫(kù)本身具有很好的洞察力,很好的職業(yè)習(xí)慣,告訴你一些易犯的錯(cuò)誤和操作建議。我能記起這樣的很多例子,一個(gè)數(shù)據(jù)庫(kù)管理員的建議節(jié)約了我們很多的時(shí)間和提供給我們一個(gè)很好的解決方案。

在大多數(shù)情況下,擁有好的數(shù)據(jù)庫(kù)管理員,并且和他們保持良好的關(guān)系對(duì)你ORM(對(duì)象關(guān)系映射)工作至關(guān)重要。

2)從一開始使用(***強(qiáng)制使用)好的命名標(biāo)準(zhǔn)

我們知道對(duì)命名標(biāo)準(zhǔn)的討論將會(huì)有爭(zhēng)議的,但是我們必須明確一件事情,我們的命名要讓我們的數(shù)據(jù)模型有意義,這能讓開發(fā)者使用起來簡(jiǎn)單,以免他們迷惑。所以,如何命名實(shí)體和屬性是非常重要的。我有我喜歡命名標(biāo)準(zhǔn),并且認(rèn)為他們是***的,但是在這里我不想把他們強(qiáng)加于你們。最重要的是你自己做出決定使用什么樣的命名標(biāo)準(zhǔn),并且讓所有人使用它。實(shí)際上,不僅僅命名標(biāo)準(zhǔn)需要統(tǒng)一,其它的也需要(如,布爾型用“Y/N” 或者 0/1表示)。


3)不要試著映射所有的屬性

我們總是設(shè)法使用工具,如Dali來映射所有的東西,然后形成一張表格(一些表格有上百列 ?。?。這最終會(huì)很麻煩。為什么?因?yàn)槲覀兪褂玫氖枪灿玫?,先前的?shù)據(jù)庫(kù),有許多的字段是我們并不關(guān)心和從來不使用的。映射它們只會(huì)導(dǎo)致性能問題和造成混亂。

4)讓數(shù)據(jù)庫(kù)做自己擅長(zhǎng)的工作

我們想有一個(gè)好的,清晰的數(shù)據(jù)模型,因此我們不惜任何代價(jià)寫一些額外的查詢語(yǔ)句來獲取對(duì)象相關(guān)數(shù)據(jù),要么使用存儲(chǔ)過程,要么使用函數(shù)。這是做法是錯(cuò)誤的,數(shù)據(jù)庫(kù)優(yōu)勢(shì)在于存儲(chǔ),而不是保持Hibernate創(chuàng)建或讀寫的數(shù)據(jù)。舉個(gè)例子,我們有一個(gè)對(duì)象,與之相關(guān)聯(lián)的有一個(gè)狀態(tài)。這個(gè)狀態(tài)在整個(gè)應(yīng)用程序中都要用到,因此,它毫無疑問是要執(zhí)行的,但是,我們不想每次都要單獨(dú)的寫一個(gè)查詢語(yǔ)句。這個(gè)問題在于,這個(gè)狀態(tài)是從一些統(tǒng)計(jì)計(jì)算中派生出來的,并且這些統(tǒng)計(jì)計(jì)算需要用到一對(duì)多的關(guān)系。每次從加載的對(duì)象中讀取數(shù)據(jù)的代價(jià)是非常高的。后來跟我們其中的一位數(shù)據(jù)庫(kù)管理員交流了一下,發(fā)現(xiàn)一個(gè)我們可以使用的sql函數(shù)能夠很快的獲得該狀態(tài)。我們使用@Formula來映射成一個(gè)狀態(tài)屬性,就能得到我們所需要的所有東西。這仍就是域模型的一部分,但是執(zhí)行起來非常好。有時(shí)像這樣的一個(gè)折衷的辦法能夠起到很大的效果。

5)分解數(shù)據(jù)庫(kù)

在一開始,我就想在Hibernate中模型化整個(gè)數(shù)據(jù)庫(kù)。結(jié)果發(fā)現(xiàn)這是不切實(shí)際的,原因如下:
a)這是一項(xiàng)巨大的工程,并且要花費(fèi)幾周的時(shí)間,而用戶根本看不到你做了什么實(shí)際的工作。

b)我不可能在***次就把它弄好,后繼的開發(fā)者無論如何都會(huì)修改它們的。

現(xiàn)在有一個(gè)趨勢(shì),就是希望在開始之前,將所有的事情都進(jìn)行映射,但是,當(dāng)時(shí)你開始這么做后,你不需在這上面花很多的時(shí)間。我后來發(fā)現(xiàn)一個(gè)好的辦法,就是將數(shù)據(jù)庫(kù)分解,工作的時(shí)候一塊一塊的進(jìn)行,發(fā)現(xiàn)這很有幫助。


6)密切注意觸發(fā)器

密切注意數(shù)據(jù)庫(kù)觸發(fā)器有如下兩個(gè)原因:

a)在后臺(tái)觸發(fā)器很隱蔽的執(zhí)行了一些功能,讓你很是疑惑,不知道發(fā)生了什么。

b)當(dāng)你在Hibernate端需要復(fù)制一些東西的時(shí)候,觸發(fā)器會(huì)做一些手腳。之前我們好幾次沒有認(rèn)識(shí)到這個(gè)教訓(xùn),導(dǎo)致我們丟失了很多數(shù)據(jù),這些都是由觸發(fā)器引起的,這幾乎讓我們很是郁悶。
 
7)避免使用工具來自動(dòng)生成你的模型


沒錯(cuò),這些工具的使用可以節(jié)約時(shí)間(雖然我們發(fā)現(xiàn)了Dali有一個(gè)很嚴(yán)重的bug,但是我們還是使用它),但是***你不得不重新做很多的事情。其實(shí)手動(dòng)也花費(fèi)不了你很多的時(shí)間,當(dāng)你親自做的時(shí)候,這可以讓你有機(jī)會(huì)熟悉那些數(shù)據(jù)。

8) 盡量多的使用命名查詢語(yǔ)句(NamedQueries)

雖然很容易寫查詢語(yǔ)句,但是在許多的情況下,使用NamedQueries會(huì)更好,這會(huì)有助于你完成兩件事情:

a)它能更加重用,因?yàn)楸幻牟樵冋Z(yǔ)句通常在代碼的重要地方。

b)你的查詢語(yǔ)句在開始的時(shí)候就是正確的,那么在查詢語(yǔ)句中的錯(cuò)誤更加容易發(fā)現(xiàn)。
要習(xí)慣這樣做需要花一些時(shí)間,但是這么做是值得的。

9)預(yù)期管理

對(duì)于任何一種框架、技術(shù)、甚至觀念來說,這是非常重要的,要銘記在心。由于某些原因,人們傾向于專注某一個(gè)特征,這些特征實(shí)際上或許不存在,或許被夸大。有時(shí)它很小,很容易理解(舉個(gè)例子,理解一些實(shí)際的工作,需要在Hibernate中映射),有時(shí)我也不知道他們是如何管理實(shí)現(xiàn)一些概念(如Hibernate是如何管理計(jì)劃修正的)。無論如何,找到預(yù)期目標(biāo)是什么,然后管理它們是非常重要的。如果你的團(tuán)隊(duì)認(rèn)為Hibernate會(huì)使得數(shù)據(jù)庫(kù)管理員沒有用處,把他們解雇,那么你將會(huì)有一個(gè)潛在的問題存在。

10)使用富域模型(rich domain modeling)

我所遇到的一件很悲哀的事情,就是在域?qū)ο髢H僅是一個(gè)簡(jiǎn)單的數(shù)據(jù)容器的時(shí)候,我要使用Hibernate,而像Hibernate這樣的工具讓我們以面向?qū)ο蟮姆绞絹硎褂脭?shù)據(jù)。簡(jiǎn)單的映射數(shù)據(jù)只是讓我們停留在中途。當(dāng)我本能的想到使用富域模型(rich domain modeling)的時(shí)候,我發(fā)現(xiàn)我們可以重用很多的代碼,我們的其它層變得不那么混亂了,并且我們的代碼更加容易測(cè)試。

感謝各位的閱讀!關(guān)于“Hibernate/JPA如何使用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI