簡(jiǎn)單講解Hibernate數(shù)據(jù)
在向大家詳細(xì)介紹Hibernate數(shù)據(jù)之前,首先讓大家了解下Hibernate為企業(yè)應(yīng)用開(kāi)發(fā)者操作關(guān)系數(shù)據(jù)庫(kù)的提供了清晰明了而又強(qiáng)大的工具,然后全面介紹Hibernate數(shù)據(jù)。
Hibernate數(shù)據(jù)
目前人們很容易發(fā)現(xiàn)Hibernate正迅速的成為流行的J2EE的O/R映射工具和數(shù)據(jù)集成框架(如果不是***的)。Hibernate為企業(yè)應(yīng)用開(kāi)發(fā)者操作關(guān)系數(shù)據(jù)庫(kù)的提供了清晰明了而又強(qiáng)大的工具。然而如果你需要在外部訪問(wèn)那些包裝在J2EE web應(yīng)用里的實(shí)體,情況又怎樣呢?你的開(kāi)發(fā)跟應(yīng)用獨(dú)立分開(kāi),卻又相同的實(shí)體以訪問(wèn)你的數(shù)據(jù)嗎?又或者你得編寫(xiě)附加的web組件來(lái)管理對(duì)數(shù)據(jù)的內(nèi)部訪問(wèn)嗎?
在很多情況下,這些問(wèn)題都會(huì)出現(xiàn)。我的情況是我的公司需要將來(lái)自多個(gè)供應(yīng)商,有著多種文件格式的記錄導(dǎo)入到數(shù)據(jù)庫(kù)里。我想起我以前經(jīng)常使用的方法,那就是編寫(xiě)Shell和SQL教本(甚至是存儲(chǔ)過(guò)程)來(lái)導(dǎo)入數(shù)據(jù)。但是由于我們的數(shù)據(jù)模型太過(guò)復(fù)雜,我決定在web應(yīng)用之外盡可能的利用現(xiàn)有的實(shí)體,Spring DAO以及服務(wù)并且開(kāi)發(fā)一個(gè)自定義的J2SE命令行數(shù)據(jù)加載工具。
現(xiàn)在很多Hibernate的文檔和范例都是綁定在容器上。不管是web應(yīng)用還是內(nèi)部的大型應(yīng)用,總會(huì)使用到容器的。人們有很好的理由去使用它。容器是設(shè)計(jì)來(lái)提供對(duì)各種特性的支持,例如事務(wù)處理,線程以及安全。現(xiàn)今,這些特性都是開(kāi)發(fā)中等規(guī)模和企業(yè)應(yīng)用所必需的工具。然而當(dāng)你需要在容器之外訪問(wèn)實(shí)體時(shí),你該怎樣呢?你是使用現(xiàn)有的架構(gòu)和代碼呢,還是會(huì)從一個(gè)不同的角度來(lái)解決問(wèn)題,比如說(shuō)完全采用另一種開(kāi)發(fā)語(yǔ)言?當(dāng)然,我們沒(méi)有正確答案。在本文的余下部分,我將說(shuō)明我的方法:就是在Spring容器之外重用現(xiàn)有的實(shí)體/POJO.
起初,腳本語(yǔ)言,例如Perl,Python,Ruby甚至Tcl(是的,我以前也做過(guò)這個(gè))看起來(lái)有很多優(yōu)勢(shì)。它們能省下很多時(shí)間,可以輕易得到初始結(jié)果,還能規(guī)避許多Hibernate潛在的復(fù)雜度。人們完全可能只用幾行代碼就可以連接數(shù)據(jù)庫(kù),查詢結(jié)果,已經(jīng)打印輸出到終端屏幕或者日志文件。然而,取決于你的數(shù)據(jù)模型,事情也(總是)會(huì)變得相當(dāng)復(fù)雜。譬如說(shuō)你有一個(gè)表 person, 其中有一個(gè)外鍵屬于表 address.當(dāng)我們添加數(shù)據(jù)的時(shí)候,表address沒(méi)有正確的插入數(shù)據(jù),就會(huì)導(dǎo)致表person 也不能插入了。這是個(gè)很典型的事務(wù)處理方面的問(wèn)題。也許有人會(huì)說(shuō)在腳本語(yǔ)言中這個(gè)問(wèn)題不難解決,就像在你的主程序里一樣。可是問(wèn)題仍然存在,為什么要這樣做呢?業(yè)務(wù)邏輯不是已經(jīng)在你的應(yīng)用里面了嗎?為什么要在寫(xiě)一遍代碼呢?而且這并不是唯一的情況,你必須重復(fù)你的工作和業(yè)務(wù)邏輯,這樣就會(huì)帶來(lái)出錯(cuò)的可能。
然而,有些人會(huì)覺(jué)得這樣也行,他們使用自己覺(jué)得最適合的工具。也許你已經(jīng)因?yàn)槌绦蛑獾脑蚨辛四撤N獨(dú)立的架構(gòu);也許你會(huì)在獨(dú)立的數(shù)據(jù)庫(kù)里加載和測(cè)試數(shù)據(jù),然后在通過(guò)各種測(cè)試后再遷移到產(chǎn)品的數(shù)據(jù)庫(kù)里;又也許你把數(shù)據(jù)庫(kù)維護(hù)外包出去,你只需要把相關(guān)文件發(fā)給合作伙伴讓他們?nèi)ヌ幚砟切﹩?wèn)題。總之,總會(huì)有很多理由不使用現(xiàn)有的Hibernate數(shù)據(jù)層。沒(méi)有誰(shuí)對(duì)誰(shuí)錯(cuò),只是如果你可以也愿意在你的應(yīng)用之外使用現(xiàn)有的代碼,請(qǐng)往下看。我會(huì)告訴你一些方法,這能解決你不少的煩惱噢。
【編輯推薦】