細(xì)說Hibernate配置文件

Hibernate配置文件主要用于配置數(shù)據(jù)庫連接和Hibernate運(yùn)行時(shí)所需的各種屬性恍飘。

每個(gè)Hibernate配置文件對應(yīng)一個(gè)Configuration對象懒棉。

Hibernate配置文件有兩種格式

hibernate.properties
hibernate.cfg.xml

JDBC連接屬性

connection.url:數(shù)據(jù)庫URL
connection.username:數(shù)據(jù)庫的用戶名
connection.password:數(shù)據(jù)庫的用戶密碼
connection.driver_class:數(shù)據(jù)庫的JDBC驅(qū)動
dialect:配置數(shù)據(jù)庫的方言,根據(jù)底層數(shù)據(jù)庫的不同產(chǎn)生不同的sql語句诡壁。Hibernate會針對數(shù)據(jù)庫的特性在訪問時(shí)進(jìn)行優(yōu)化。

C3P0數(shù)據(jù)源

hibernate.c3po.max_size:數(shù)據(jù)庫連接池的最大連接數(shù)。
hibernate.c3po.min_size:數(shù)據(jù)庫連接池的最小連接數(shù)娜饵。
hibernate.c3po.acquire_increment:當(dāng)數(shù)據(jù)庫連接池的連接耗盡時(shí),同一時(shí)刻獲取多少數(shù)據(jù)庫連接官辈。
hibernate.c3po.timeout:數(shù)據(jù)庫連接池中的連接對象多長時(shí)間沒有使用過后箱舞,就應(yīng)該被銷毀。
hibernate.c3po.idle_test_period:表示連接池檢測線程多長時(shí)間檢測一次池內(nèi)的連接對象是否超時(shí)拳亿,連接池本身不會將自己移除晴股,而是專門有一個(gè)線程多長時(shí)間檢測一次池內(nèi)所有的連接對象是否超時(shí)。這個(gè)線程通過比較連接對象最后一次的使用時(shí)間和當(dāng)前時(shí)間的時(shí)間差和timeout進(jìn)行對比肺魁,進(jìn)而決定是否銷毀這個(gè)連接對象电湘。
hibernate.c3po.max_statements:緩存Statement對象的數(shù)量。

兩個(gè)重要的Hibernate配置選項(xiàng)

hibernate.jdbc.fetch_size:實(shí)質(zhì)上是調(diào)用Statement.setFetchSize方法設(shè)定JDBC的Statement讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫中取出的記錄數(shù)鹅经。最優(yōu)值為100寂呛。
hibernate.jdbc.batch_size:設(shè)定對數(shù)據(jù)庫進(jìn)行批量刪除,批量更新和批量添加的時(shí)候批次的大小瘾晃。類似于設(shè)置緩沖區(qū)大小的意思贷痪。batchSize越大,批量操作向數(shù)據(jù)庫發(fā)送的sql越少蹦误,速度就越快劫拢。最優(yōu)值為30。

POJO類和hbm.xml

POJO類和關(guān)系數(shù)據(jù)庫之間的映射可以用一個(gè)XML文檔來定義强胰。

通過POJO類的數(shù)據(jù)庫映射文件舱沧,Hibernate可以理解為持久化類和數(shù)據(jù)表之前的對應(yīng)關(guān)系,也可以理解為持久化類的屬性和數(shù)據(jù)庫表列之間的關(guān)系偶洋。

在運(yùn)行時(shí)Hibernate將根據(jù)映射文件生成各種SQL語句熟吏。

hbm全稱為Hibernate Mapping,譯為Hibernate映射涡真。

hibernate mapping屬性解釋:

映射對象標(biāo)識符

Hibernate使用對象標(biāo)識符(OID)來建立內(nèi)存中的對象和數(shù)據(jù)表中記錄的對應(yīng)關(guān)系分俯。對象的OID和數(shù)據(jù)表中的主鍵一致。Hibernate通過標(biāo)識符生成器為主鍵賦值哆料。

Hibernate推薦在數(shù)據(jù)表中使用代理主鍵缸剪,即不具備業(yè)務(wù)含義的字段。代理主鍵通常為整數(shù)類型东亦。因?yàn)檎麛?shù)類型要比字符串類型節(jié)省更多的數(shù)據(jù)空間杏节。

在對象-關(guān)系映射文件中唬渗,<id>元素用于設(shè)置對象標(biāo)識符。<generator>用于設(shè)置標(biāo)識符生成器奋渔。

Hibernate提供了標(biāo)識符生成器接口:IdentifierGenerator镊逝,并提供了各種內(nèi)置實(shí)現(xiàn)。

increment標(biāo)識符生成器

increment標(biāo)識符生成器由Hibernate以遞增的方式為代理主鍵賦值嫉鲸。

Hibernate會先讀取表中的主鍵的最大值撑蒜,接下來向表中插入數(shù)據(jù)時(shí),就在max(id)的基礎(chǔ)上遞增玄渗。增量為1座菠。

適用范圍:

  • 由于increment生成標(biāo)識符機(jī)制不依賴于底層數(shù)據(jù)庫系統(tǒng),因此它適用于所有的數(shù)據(jù)庫系統(tǒng)藤树。
  • 適用于只有單個(gè)Hibernate應(yīng)用進(jìn)程訪問訪問同一個(gè)數(shù)據(jù)庫的場合浴滴,在集群環(huán)境下不推薦使用它岁钓。
  • OID必須為long, int或者short類型。如果將OID設(shè)為byte類型屡限,會在運(yùn)行時(shí)出現(xiàn)異常。

identity標(biāo)識符生成器

identity標(biāo)識符生成器由底層數(shù)據(jù)庫來負(fù)責(zé)生成標(biāo)識符囚霸,它要求底層數(shù)據(jù)庫將主鍵設(shè)為自增長類型腰根。

適用范圍:

  • 由于identity生成標(biāo)識符的機(jī)制依賴于底層數(shù)據(jù)庫系統(tǒng)激才,因此,要求底層數(shù)據(jù)庫系統(tǒng)必須支持自增長字段類型瘸恼。
  • OID必須為long, int或者short類型。如果將OID設(shè)為byte類型东帅,會在運(yùn)行時(shí)出現(xiàn)異常压固。

sequence標(biāo)識符生成器

sequence標(biāo)識符生成器用底層數(shù)據(jù)庫提供的序列來生成標(biāo)識符。
Hibernate在持久化一個(gè)對象后靠闭,會從底層數(shù)據(jù)庫的序列中獲取唯一的標(biāo)識號,再把它作為主鍵值愧膀。

hilo標(biāo)識符生成器

hilo標(biāo)識符生成器由Hibernate按照一種high/low算法生成標(biāo)識符,它從數(shù)據(jù)庫特定的表中的字段獲取high值芬为。

Hibernate在持久化一個(gè)對象時(shí),由Hibernate負(fù)責(zé)生成主鍵值媚朦。hilo標(biāo)識符生成器在生成標(biāo)識符時(shí),需要讀取并更改HI_TABLE表中的NEXT_VALUE值询张。

適用范圍:

  • 由于hilo標(biāo)識符機(jī)制不依賴于底層數(shù)據(jù)庫系統(tǒng),因此它適用于所有的數(shù)據(jù)庫系統(tǒng)的圆。
  • OID必須為long, int或者short類型半火。如果將OID設(shè)為byte類型,會在運(yùn)行時(shí)出現(xiàn)異常钮糖。

Native標(biāo)識符生成器

Native標(biāo)識符生成器依據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的支持能力,來選擇使用identity阎抒,sequence或hilo標(biāo)識符生成器消痛。

適用范圍:

  • 由于native能夠根據(jù)底層數(shù)據(jù)庫的類型,自動選擇合適的標(biāo)識符生成器秩伞,因此很適合用于跨數(shù)據(jù)庫平臺開發(fā)。
  • OID必須為long, int或者short類型展氓。如果將OID設(shè)為byte類型,會在運(yùn)行時(shí)出現(xiàn)異常遇汞。

映射Java的時(shí)間簿废、日期類型

在Java中代表時(shí)間和日期的類型包括,java.util.Date和java.util.Calendar。此外在JDBC API中還提供了三個(gè)擴(kuò)展了java.util.Date類的子類:java.sql.Date族檬,java.sql.Time和java.sql.Timestamp,這三個(gè)類分別和標(biāo)準(zhǔn)的SQL類型中的DATE, TIME和TIMESTAMP類型對應(yīng)轨淌。

在標(biāo)準(zhǔn)SQL中,DATE表示日期递鹉,TIME表示時(shí)間,TIMESTAMP表示時(shí)間戳却盘,同時(shí)包含日期和時(shí)間信息媳拴。

由于java.util.Date是java.sql.Date,java.sql.Time和java.sql.Timestamp的父類塞关,所以java.util.Date可以對應(yīng)標(biāo)準(zhǔn)SQL中的DATE, TIME和TIMESTAMP子巾。

所以在設(shè)置持久化類型的DATE類型是設(shè)置為java.util.Date。
如何把java.util.Date映射為Time, Date, Timestamp:
可以通過property的type屬性進(jìn)行映射:

<property name="date" type="timestamp">
    <column name="DATE"/>
</property>

其中timestamp, time, date既不是Java類型线梗,也不是標(biāo)準(zhǔn)的SQL類型仪搔,而是Hibernate映射類型瘾婿。

Java大對象類型的Hibernate映射

在Java中可以使用java.util.String表示長字符串(長度超過255)烤咧,字節(jié)數(shù)組byte[]可以用來存放圖片或文件的二進(jìn)制數(shù)據(jù)。此外髓削,在JDBC的API中還提供了java.sql.Clob和java.sql.Blob類型,它們分別對應(yīng)標(biāo)準(zhǔn)SQL中的Clob和Blob,Clob表示字符串大對象梯码,Blob表示二進(jìn)制對象。

MySQL不支持標(biāo)準(zhǔn)SQL的Clob類型儿奶,在MySQL中使用TEXT, MEDIUMTEXT和LONGTEXT類型表示長度超過255的長文本數(shù)據(jù)鳄抒。

在持久化類中椰弊,二進(jìn)制大對象可以聲明為byte[]或java.sql.Blob類型瓤鼻,字符串類型可以聲明為java.lang.String或java.sql.Clob。

實(shí)際上在Java應(yīng)用程序中茬祷,處理長度超過255的字符串祭犯,使用java.lang.String比java.sql.Clob更為方便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沃粗,一起剝皮案震驚了整個(gè)濱河市最盅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檩禾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饵婆,死亡現(xiàn)場離奇詭異戏售,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搓译,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門锋喜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人段标,你說我怎么就攤上這事炉奴。” “怎么了瞻赶?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長璧南。 經(jīng)常有香客問我,道長颤诀,這世上最難降的妖魔是什么对湃? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮心傀,結(jié)果婚禮上拆讯,老公的妹妹穿的比我還像新娘。我一直安慰自己种呐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布汁讼。 她就那樣靜靜地躺著阔墩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耸彪。 梳的紋絲不亂的頭發(fā)上忘苛,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音蜀肘,去河邊找鬼稽屏。 笑死西乖,一個(gè)胖子當(dāng)著我的面吹牛狐榔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播收捣,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庵楷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咐蚯?” 一聲冷哼從身側(cè)響起弄贿,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎期奔,沒想到半個(gè)月后危尿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肺孤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年邮绿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾腊。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挖胃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吗垮,到底是詐尸還是另有隱情凹髓,我是刑警寧澤烁登,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布饵沧,位于F島的核電站,受9級特大地震影響狼牺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掠归,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一悄泥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兄旬,春花似錦余寥、人聲如沸领铐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绎狭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喇聊,已是汗流浹背蹦狂。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凯楔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓邻遏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親削解。 傳聞我的和親對象是個(gè)殘疾皇子沟娱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容