Hibernate實(shí)戰(zhàn)(第2版)讀書(shū)筆記
最近時(shí)間重讀hibernate實(shí)戰(zhàn)(第2版),哈哈,很長(zhǎng)時(shí)間不用幾乎都忘完了?,F(xiàn)在作為讀書(shū)筆記記錄下來(lái),以供自己和別人參考。部分例子摘自hibernate實(shí)戰(zhàn)(第2版)書(shū)中。本人能力有限,難免出現(xiàn)錯(cuò)誤的地方,歡迎指正。
在hibernate使用seqence的主鍵生成策略時(shí)候,要這樣寫(xiě)(下面的寫(xiě)法是針對(duì)HSQLDB,不清楚在其他數(shù)據(jù)庫(kù)也通用)
Xml代碼:
- <id column="MY_ID">
- <generator class="sequence">
- <param name="sequence">MY_SEQUENCE< SPAN>param>
- <param name="parameters">
- START WITH 1 INCREMENT BY 1
- < SPAN>param>
- < SPAN>generator>
- <id>
- <id column="MY_ID">
- <generator class="sequence">
- <param name="sequence">MY_SEQUENCE< SPAN>param>
- <param name="parameters">
- START WITH 1 INCREMENT BY 1
- < SPAN>param>
- < SPAN>generator>
- <id>
hibernate實(shí)戰(zhàn)(第2版)書(shū)中是這樣寫(xiě)的 INCREMENT 1 START WITH 1,這樣寫(xiě)插入的call next value for MY_SEQUENCE 返回的是0,START WITH 1 INCREMENT BY 1 執(zhí)行call next value for MY_SEQUENCE返回的是1,這樣奇怪的問(wèn)題,難道是hsqldb有bug?我也沒(méi)有去做過(guò)多的深究。
Xml代碼:
- <class dynamic-insert="true" dynamic-update="true">
dynamic-insert 屬性告訴hibernate是否在insert語(yǔ)句中包含空的屬性值(設(shè)置為true,是表明在insert語(yǔ)句中不包含為null的屬性,也就是insert語(yǔ)句中包含的屬性必須是非空的字段)。
這兩個(gè)屬性在某些地方會(huì)有用,比如說(shuō)在更新中設(shè)置dynamic-update=true,如果你僅僅更新了一個(gè)屬性,沒(méi)有必要把其他屬性的更新也放在sql中,也提高了數(shù)據(jù)庫(kù)的執(zhí)行效率。但是也帶來(lái)一個(gè)副作用,可能就是hibernate要進(jìn)行比較每個(gè)屬性的值,來(lái)決定是否在sql語(yǔ)句中包含這個(gè)字段。當(dāng)然這對(duì) 字段比較多的類(lèi)是比較有用的。dynamic-insert在做insert操作時(shí)候,也是如此。
Xml代碼:
- <hibernate-mapping default-access="field">
- <class mutable="false">
標(biāo)記這個(gè)類(lèi)為不可變類(lèi)。這樣hibernate就可以避免做臟檢查。為了保持這個(gè)不可變屬性,***不寫(xiě)set方法,僅僅保留get方法。設(shè)置值通過(guò)構(gòu)造來(lái)設(shè)置。還要明確指示hibernate訪問(wèn)這個(gè)類(lèi)的字段要通過(guò)field來(lái)訪問(wèn),而不是通過(guò)get-set方法,這個(gè)由 hibernate-mapping的 default-access="field"來(lái)設(shè)置。
Xml代碼:
- <hibernate-mapping auto-import="false">
- <import class="mypackage.Class" rename="Hello" />
- < SPAN>hibernate-mapping>
一般情況下,你寫(xiě)一個(gè)類(lèi)的映射后,hibernate 會(huì)自動(dòng)的導(dǎo)入到HQL的命名空間中。你在HQL查詢時(shí)候可以僅僅通過(guò)類(lèi)名,而不是包名.類(lèi)名來(lái)使用指定的類(lèi)了。但是,存在這樣一種情況,如果在不同包中有相同的類(lèi)名,在HQL中就會(huì)引起歧義,不過(guò)一個(gè)很好的辦法就是在hibernate-mapping中關(guān)閉自動(dòng)導(dǎo)入的屬性,采取顯式導(dǎo)入,然后重命名之。這樣,你在HQL中就可以直接寫(xiě) from Hello,而避免了歧義。
Xml代碼:
- <hibernate-mapping package="mypackage.model">
定義package這個(gè)屬性,可以在這個(gè)映射文件中給所有未以包名開(kāi)頭的類(lèi)名加上定義的包作為前綴。
Xml代碼:
- <property name="description" column="`description`">
之所以加反引號(hào),是因?yàn)槟阌X(jué)得可能description在特定的數(shù)據(jù)庫(kù)中是關(guān)鍵字。你加上反引號(hào)后,hibernate會(huì)為你針對(duì)不同的數(shù)據(jù)庫(kù)做特定的轉(zhuǎn)化。例如sqlserver,hibernate會(huì)為你加上[description],mysql加上`description`,另外在在hsqldb中給description加反引號(hào)后,產(chǎn)生的是"description",這樣執(zhí)行起來(lái)反而會(huì)報(bào)錯(cuò)。
Xml代碼 :
- <property name="description" column="desc" access="field">
指定description字段通過(guò)field直接訪問(wèn)。
Xml代碼:
- <property name="total" formula="total + tax_rate * total">
這個(gè)公式在每次查詢時(shí)候求值,并且這個(gè)屬性不會(huì)被保存和更新,如果你改變其中的數(shù)據(jù)例如tax_rate,屬性值不會(huì)去自動(dòng)計(jì)算。
Xml代碼:
- <property name="mydata" update="false" insert="false">
如果update和i nsert都設(shè)置false的話,這個(gè)字段就不會(huì)出現(xiàn)在INSERT和UPDATE語(yǔ)句中。通常不再類(lèi)中給不可變的屬性添加公有的設(shè)置方法。
Xml代碼:
- <property generated="always"
generated的合法值是always和insert。這個(gè)屬性通常和dynamic-insert配合起來(lái)才更有用。一般用來(lái)在屬性中插入默認(rèn)值。
initial_price number(10, 2) default '1'
Xml代碼:
- <property name="initial_price">
- <column name="initial_price"
- default="1" generated="insert"/>
- < SPAN>property>
其中的default屬性,只在生成表結(jié)構(gòu)時(shí)候有用。hibernate并不會(huì)在Java類(lèi)中,給空的屬性設(shè)置默認(rèn)值。
在插入有default屬性的字段中,要想使default起作用,必須設(shè)置dynamic-insert=true,這樣保證有default屬性的字段字段不會(huì)出現(xiàn)在insert中(default的字段為null),否則,它的值為null(插入NULL而不是默認(rèn)值),另外默認(rèn)值插入到數(shù)據(jù)庫(kù)之后,因?yàn)樵O(shè)置了generated=always,hibernate會(huì)在插入后自動(dòng)的執(zhí)行一個(gè)select,給Java類(lèi)中的屬性設(shè)置,如果沒(méi)有設(shè)置generated屬性,需要顯式調(diào)用session.flush()語(yǔ)句。
Xml代碼:
- <class name="Hello">
- <component name="Address">
- <property name="">
- <component>
- < SPAN>class>
如果component中說(shuō)有的屬性都為null,那么查詢時(shí)候,這個(gè)組件個(gè)引用是null,就是說(shuō)hello.getAddress()返回的是null,只要有至少一個(gè)不為null,那么返回這個(gè)組件的引用將不是null。
【編輯推薦】
- 初學(xué)者適用的Hibernate學(xué)習(xí)方法
- Hibernate優(yōu)化方法解析
- Hibernate一對(duì)多關(guān)系的處理
- Struts與Hibernate的***結(jié)合方案
- Hibernate的性能優(yōu)化