Hibernate實戰(zhàn)(第2版)讀書筆記
hibernate實戰(zhàn)(第2版)讀書筆記(一)
最近時間重讀hibernate實戰(zhàn)(第2版),哈哈,很長時間不用幾乎都忘完了。現(xiàn)在作為讀書筆記記錄下來,以供自己和別人參考。部分例子摘自hibernate實戰(zhàn)(第2版)書中。本人能力有限,難免出現(xiàn)錯誤的地方,歡迎指正。
在hibernate使用seqence的主鍵生成策略時候,要這樣寫(下面的寫法是針對HSQLDB,不清楚在其他數(shù)據(jù)庫也通用)
Xml代碼
|
實戰(zhàn)(第2版)書中是這樣寫的 INCREMENT 1 START WITH 1,這樣寫插入的call next value for MY_SEQUENCE 返回的是0,START WITH 1 INCREMENT BY 1 執(zhí)行call next value for MY_SEQUENCE返回的是1,這樣奇怪的問題,難道是hsqldb有bug?我也沒有去做過多的深究。
Xml代碼
dynamic-insert 屬性告訴hibernate是否在insert語句中包含空的屬性值(設(shè)置為true,是表明在insert語句中不包含為null的屬性,也就是insert語句中包含的屬性必須是非空的字段)。
dynamic-update屬性告訴hibernate是否在update語句中包含未被修改的屬性值(設(shè)置為true,表明update語句中不包含未修改的字段)。
這兩個屬性在某些地方會有用,比如說在更新中設(shè)置dynamic-update=true,如果你僅僅更新了一個屬性,沒有必要把其他屬性的更新也放在sql中,也提高了數(shù)據(jù)庫的執(zhí)行效率。但是也帶來一個副作用,可能就是hibernate要進行比較每個屬性的值,來決定是否在sql語句中包含這個字段。當(dāng)然這對 字段比較多的類是比較有用的。dynamic-insert在做insert操作時候,也是如此。
Xml代碼
Xml代碼
一般情況下,你寫一個類的映射后,hibernate 會自動的導(dǎo)入到HQL的命名空間中。你在HQL查詢時候可以僅僅通過類名,而不是包名.類名來使用指定的類了。但是,存在這樣一種情況,如果在不同包中有相同的類名,在HQL中就會引起歧義,不過一個很好的辦法就是在hibernate-mapping中關(guān)閉自動導(dǎo)入的屬性,采取顯式導(dǎo)入,然后重命名之。這樣,你在HQL中就可以直接寫 from Hello,而避免了歧義。
Xml代碼
定義package這個屬性,可以在這個映射文件中給所有未以包名開頭的類名加上定義的包作為前綴。
Xml代碼
之所以加反引號,是因為你覺得可能description在特定的數(shù)據(jù)庫中是關(guān)鍵字。你加上反引號后,hibernate會為你針對不同的數(shù)據(jù)庫做特定的轉(zhuǎn)化。例如sqlserver,hibernate會為你加上[description],mysql加上`description`,另外在在hsqldb中給description加反引號后,產(chǎn)生的是"description",這樣執(zhí)行起來反而會報錯。
Xml代碼
指定description字段通過field直接訪問。
Xml代碼
這個公式在每次查詢時候求值,并且這個屬性不會被保存和更新,如果你改變其中的數(shù)據(jù)例如tax_rate,屬性值不會去自動計算。
Xml代碼
如果update和i nsert都設(shè)置false的話,這個字段就不會出現(xiàn)在INSERT和UPDATE語句中。通常不再類中給不可變的屬性添加公有的設(shè)置方法。
Xml代碼
initial_price number(10, 2) default '1' |
其中的default屬性,只在生成表結(jié)構(gòu)時候有用。hibernate并不會在java類中,給空的屬性設(shè)置默認(rèn)值。
在插入有default屬性的字段中,要想使default起作用,必須設(shè)置dynamic-insert=true,這樣保證有default屬性的字段字段不會出現(xiàn)在insert中(default的字段為null),否則,它的值為null(插入NULL而不是默認(rèn)值),另外默認(rèn)值插入到數(shù)據(jù)庫之后,因為設(shè)置了generated=always,hibernate會在插入后自動的執(zhí)行一個select,給java類中的屬性設(shè)置,如果沒有設(shè)置generated屬性,需要顯式調(diào)用session.flush()語句。
Xml代碼
【編輯推薦】