通過設置屬性lazy進行設置是否需要懶加載。當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
Hibernate 常用的緩存有一級緩存和二級緩存:
一級緩存:也叫 Session 緩存,只在 Session 作用范圍內有效,不需要用戶干涉,由 hibernate 自身維護,可以通過:evict(object)清除 object 的緩存;clear()清除一級緩存中的所有緩存;flush()刷出緩存;
二級緩存:應用級別的緩存,在所有 Session 中都有效,支持配置第三方的緩存,如:EhCache。
通過配置文件中的many-to-one、one-to-many、many-to-many來實現類之間的關聯關系的。
可以將Hibernate的實體類定義為final類,但不建議這么做。因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果你把實體類定義成final類之后,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。
Integer 類型為對象,它的值允許為 null,而 int 屬于基礎數據類型,值不能為 null。
Hibernate框架會調用這個默認構造方法來構造實例對象,即Class類的newInstance方法 ,這個方法就是通過調用默認構造方法來創建實例對象的 。如果在實體類中找不到無參數的構造器,這個方法就會拋出一個InstantiationException異常。
Hibernate在做插入操作時會把要操作的對象全部放到自身的內部緩存來進行管理。當海量數據插入的時候,會有很多對象被納入內部緩存,就可能出現OutOfMemoryError(內存溢出異常),因此最好做到如下三點:
1.做海量數據批量操作一定要關閉控制臺顯示執行的sql語句;
2.繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的,也是最快的;
3.如果還是使用Hibernate API ,使用分段插入。
1)HQL優化
2)API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)
3)主配置參數(日志,查詢緩存,fetch_size, batch_size等)
4)映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)
5)一級緩存的管理
6)針對二級緩存,還有許多特有的策略