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