休眠陷阱
因此,這是我的監(jiān)視清單,希望對(duì)其他人也有用。
實(shí)現(xiàn)hashCode和equals
一般而言,應(yīng)該始終實(shí)現(xiàn)這些方法,但對(duì)于實(shí)體,應(yīng)該多加注意。當(dāng)我說(shuō)等于時(shí),您想到的第一件事可能是使用Id來(lái)區(qū)分實(shí)例。 好吧,那會(huì)給您帶來(lái)很多麻煩。
您需要記住,您正在使用數(shù)據(jù)庫(kù)實(shí)體而不是普通的POJO。
當(dāng)Hibernate提取對(duì)象時(shí),您將使用collections,因此使用equals和hashCode來(lái)知道您要查找的對(duì)象是否在會(huì)話中。 對(duì)于新對(duì)象,id將為null或0。
這意味著當(dāng)試圖保存兩個(gè)相同類的對(duì)象時(shí),第二個(gè)對(duì)象將覆蓋第一個(gè)對(duì)象。
同樣,當(dāng)休眠保存新實(shí)例時(shí),它將設(shè)置id,從而使它成為完全相同的不同對(duì)象。 您需要使用一些業(yè)務(wù)密鑰。 唯一的代碼很棒,但是如果您什么都想不起,只需使用一個(gè)有意義的字段和一些時(shí)間戳(例如創(chuàng)建日期)即可使其唯一。
如果您想進(jìn)一步了解正在發(fā)生的事情, 這是一個(gè)很好的參考。
小心一對(duì)一和多對(duì)一關(guān)系
這是您真正需要知道的。
在關(guān)系的“一對(duì)一”側(cè)將關(guān)系映射為一對(duì)一或多對(duì)一時(shí), 除非將字段指定為不可為空,否則您 不能延遲加載 。
這是為什么?
本質(zhì)上,在關(guān)系的許多方面,hibernate可以使用集合代理,并在需要時(shí)延遲加載實(shí)例。 在“一個(gè)”一側(cè),沒有集合接口,而是對(duì)您的一個(gè)模型類的引用。
Hibernate也可以代理該代理,但前提是必須確保引用永遠(yuǎn)不會(huì)為空!
因此,請(qǐng)記住,如果要進(jìn)行延遲加載,請(qǐng)?jiān)谝粋?cè)與延遲注釋(或xml等效項(xiàng))一起使用not null。
如果您的關(guān)系可以為空,但是您仍然真的想使其變得懶惰,那么您可以使用以下選擇:
- 創(chuàng)建一個(gè)值來(lái)表示該值。 例如,如果您具有諸如Person-& gtPartner之類的關(guān)系,則僅使用特定的Partner實(shí)例,即“無(wú)合作伙伴”。
- 使用構(gòu)建時(shí)間檢測(cè)。 檢查一下
- 使用列表偽造一側(cè)并使用get(0)獲取字段
有關(guān)休眠文檔的信息 。
啟用語(yǔ)句記錄
這是驗(yàn)證Hibernate確實(shí)在按預(yù)期執(zhí)行的唯一方法。 幸運(yùn)的是,您可以使用不同的日志記錄參數(shù)來(lái)找出HQL或SQL級(jí)別正在發(fā)生的事情。 您會(huì)驚訝于休眠狀態(tài)運(yùn)行查詢的次數(shù),而您沒有看到它。 從一開始就嘗試執(zhí)行此操作,并幫助團(tuán)隊(duì)了解擁有最佳和最少查詢的重要性,否則當(dāng)您在某些實(shí)際數(shù)據(jù)上運(yùn)行應(yīng)用程序時(shí),肯定會(huì)遇到性能問題。 要啟用日志記錄,只需在會(huì)話配置文件中設(shè)置此屬性
hibernate.show_sql=true如果要查看格式正確的添加
hibernate.format_sql=true觀察toString方法中的內(nèi)容。
這又與Hibernate在沒有真正意識(shí)到的情況下為您獲取的內(nèi)容有關(guān)。 很多時(shí)候,當(dāng)您看到查詢但無(wú)法弄清為什么要加載一些惰性列表時(shí),請(qǐng)檢查toString方法。
可能是罪魁禍?zhǔn)?#xff01;
您的休眠陷阱是什么?
參考: Hibernate陷阱! 來(lái)自我們的JCG合作伙伴在發(fā)展中博客上的 報(bào)道 。
相關(guān)文章 :- 休眠自動(dòng)提交命令強(qiáng)制MySQL在過(guò)多的磁盤I / O中運(yùn)行
- DataNucleus 3.0與Hibernate 3.5
- Hibernate映射集合性能問題
- Spring MVC3 Hibernate CRUD示例應(yīng)用程序
翻譯自: https://www.javacodegeeks.com/2011/08/hibernate-gotchas-to-watch-out.html
總結(jié)
- 上一篇: 买房需到房管局备案吗(买房需到房管局备案
- 下一篇: linux的find命令用法(Linux