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更為方便。