1、持久化對象的狀態都有哪些?
答:瞬時對象(Transient Objects):使用new 操作符初始化的對象不是立刻就持久的。它們的狀態是瞬時的,也就是說它們沒有任何跟數據庫表相關聯的行為,只要應用不再引用這些對象(不再被任何其它對象所引用),它們的狀態將會丟失,並由垃圾回收機制回收。
持久化對象(Persist Objects):持久實例是任何具有數據庫標識的實例。它有持久化管理器Session統一管理,持久實例是在事務中進行操作的——它們的狀態在事務結束時同數據庫進行同步。當事務提交時,通過執行SQL的INSERT、UPDATE和DELETE語句把內存中的狀態同步到數據庫中。
離線對象(Detached Objects):Session關閉之后,持久化對象就變為離線對象。離線表示這個對象不能再與數據庫保持同步,它們不再受Hibernate管理。
2、Hibernate工作原理及為什么要用?
答:原理:
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.得到session,並打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
為什么要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
3. Hibernate是如何延遲加載?
1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲加載功能
當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
4. 說下Hibernate的緩存機制
答:1.內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存
2.二級緩存:
a)應用及緩存
b)分布式緩存
條件:數據不會被第三方修改、數據大小在可接受范圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據
c) 第三方緩存的實現
5、Hibernate中的SessionFactory有什么作用? SessionFactory是線程安全的嗎?
答:SessionFactory就是一個用於創建Hibernate的Session對象的工廠。SessionFactory通常是在應用啟動時創建好的,應用程序中的代碼用它來獲得Session對象。作為一個單個的數據存儲,它也是 線程安全的,所以多個線程可同時使用同一個SessionFactory。Java JEE應用一般只有一個SessionFactory,服務於客戶請求的各線程都通過這個工廠來獲得Hibernate的Session實例,這也是為什么SessionFactory接口的實現必須是線程安全的原因。還有,SessionFactory的內部狀態包含着同對象關系影射有關的所有元數據,它是 不可變的,一旦創建好后就不能對其進行修改了。
6. Hibernate的查詢方式
答:Sql、Criteria,objectcomposition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數
7. 如何優化Hibernate?
答:1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
8、在數據庫中條件查詢速度很慢的時候,如何優化?
答:1.建索引
2.減少表之間的關聯
3.優化sql,盡量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引,把數據量大的表排在前面
4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量數據
9、Hibernate中的Session指的是什么? 可否將單個的Session在多個線程間進行共享?
答:Session代表着Hibernate所做的一小部分工作,它負責維護者同數據庫的鏈接而且 不是線程安全的,也就是說,Hibernage中的Session不能在多個線程間進行共享。雖然Session會以主動滯后的方式獲得數據庫連接,但是Session最好還是在用完之后立即將其關閉。
10、Hibernate中get和load有什么不同之處?
答:get和load的最大區別是,如果在緩存中沒有找到相應的對象,get將會直接訪問數據庫並返回一個完全初始化好的對象,而這個過程有可能會涉及到多個數據庫調用;而load方法在緩存中沒有發現對象的情況下,只會返回一個代理對象,只有在對象getId()之外的其它方法被調用時才會真正去訪問數據庫,這樣就能在某些情況下大幅度提高性能。你也可以參考 Hibernate中get和load的不同之處, 此鏈接給出了更多的不同之處並對該問題進行了更細致的討論。
11、Hibernate中save、persist和saveOrUpdate這三個方法的不同之處?
答:也就是save()、saveOrUpdate()和persist()都是用於將對象保存到數據庫中的方法,但其中有些細微的差別。例如,save()只能INSERT記錄,但是saveOrUpdate()可以進行 記錄的INSERT和UPDATE。還有,save()的返回值是一個Serializable對象,而persist()方法返回值為void。你還可以訪問 save、persist以及saveOrUpdate,找到它們所有的不同之處。
12、Hibernate中的命名SQL查詢指的是什么?
答:命名查詢指的是用標簽在影射文檔中定義的SQL查詢,可以通過使用Session.getNamedQuery()方法對它進行調用。命名查詢使你可以使用你所指定的一個名字拿到某個特定的查詢。 Hibernate中的命名查詢可以使用注解來定義,也可以使用我前面提到的xml影射問句來定義。在Hibernate中,@NameQuery用來定義單個的命名查詢,@NameQueries用來定義多個命名查詢。
13、hibernate中sorted collection和ordered collection有什么不同?
答:sorted collection是通過使用 Java的Comparator在內存中進行排序的,ordered collection中的排序用的是數據庫的order by子句。對於比較大的數據集,為了避免在內存中對它們進行排序而出現 Java中的OutOfMemoryError,最好使用ordered collection。
