Hibernate小記

1 講講一下orm框架 以及各個orm框架的區別

答:o---Object對象。r---關係數據庫。m---映射文件。用對象的方式去操作關係數據庫(原來是sql語句)

orm類型 映射關係 開發效率 數據庫移植
hibernate: 全自動 實體類和數據庫 自動生成sql 不同數據庫類型的支持
ibatis: 半自動 實體類和SQL語句 需要編寫具體的sql 標準SQL方便移植

2 hibernate 的原理及其步驟
答:1.讀取配置(Configuration)*.cfg.xml。
2.使用Configuration創建SessionFactory(線程安全)。
3.使用SessionFactory創建Session(線程不安全,使用本地線程TheradLocal解決)。
SessionFactory提供了兩種方式得到session。
3 說出Hibernate的核心類和接口:
答:
Configuration:管理從配置文件(*.cfg.xml)中讀取的信息。
SessionFactory:根據配置信息創建一個SessionFactory實例。
Session:持久化方法是通過Session來完成的。

4 hibernate 實體的3種狀態
答:
1.瞬時狀態:這種狀態一般都是剛new出來,
2.持久化狀態:當數據與session產生關聯後就由瞬時狀態轉變爲持久化狀態,
3.離線狀態:這種狀態曾經被持久化過,而且數據庫中也與之有關聯,但是當前session已經關閉,與Session已經沒有任何的關聯,

5 hibernate的幾種查詢方式 hibernate的sql查詢接口是什麼
答:
1.hql查詢:hql是面向對象而不是面向數據庫的查詢,
hql支持兩種查詢方式:佔位符(問號)與命名參數(冒號),不支持*操作,不適合動態查詢。
2.sql查詢:SQLQuery就是sql的查詢接口,此時查詢就是sql語句表名就是表名字段名就是字段名
也支持命名參數與佔位符,但是它的移植性差。
3.qbc查詢:Criteria是qbc的查詢接口,這種查詢方式不需要sql語句也不需要hql查詢方法,不過對於太複雜的查詢還是不建議使用,
通過Criteria使用Session創建出來的實例.add(Restrictions.eq("字段",條件))來進行條件查詢。

6 什麼是hibernate主鍵生成機制 舉例說明
答:通過使用不同的主鍵機制而產生不同的主鍵性能。一般是策略模式

最常用的是native 由Hibernate根據使用的數據庫自行判斷採用 identity、hilo、sequence 其中一種作爲主鍵生成方式。

7 闡述一下hibernate的映射 在關聯映射中一對多 和 多對多 是如何實現的 要注意什麼問題 
答:
映射分爲四種:
1 基本類型的映射。
2 集合映射:加一個表,主鍵關聯起來,1 list映射 有序可重複,2 set 無序不可重複,3 bag 無序可重複,4 map映射。
3 級聯映射:1 一對一(one to one ),2 一對多(one to many),3 多對多(many to many)

8 hibernate的緩存是什麼 用來幹什麼的 什麼時候用什麼方法刷新緩存 各種緩存裏放的是什麼東西 使用緩存應該注意什麼
答:
1. 緩存是什麼:緩存是介於物理數據源與應用程序之間,提高程序性能的一種方式

3. 一級緩存,是session共享級別的,hibernate內置的緩存,

4. 二級緩存,SessionFactory級共享,是放在配置文件中,

5. 查詢緩存,Query,Criteria(查詢緩存)由於命中率較低,所以hibernate默認是關閉的。

9 load與get save與persist saveorupdate與merge list與iterator 區別
答:它們的是把數據放入緩存中的。
1 load()(支持懶加載)根據id在查詢時不會立即訪問數據庫,而是在需要使用時纔會訪問數據庫,如果id不存在會報找不到id錯誤。
  get(不支持懶加載)根據id查詢時會立即訪問數據庫,如果id不存在則返回null。

4 list它是一次性把所有的數據查詢出來,而且會把查詢出來的數據放入一級緩存中,也會放入二級緩存,會把讀出來的數據放入查詢緩存中,
但是不使用一級緩存,同樣也不使用二級緩存,list會使用查詢緩存。
iterator不會把查詢出來的數據放入一級緩存中,也不會放入二級緩存,但是使用一級緩存,同樣會使用二級緩存,不使用查詢緩存,

項目中用list與iterator:先使用list查詢,因爲它會把查詢出來的數據放入緩存中,然後使用iterator,它會去緩存中查找數據。

10 什麼是懶加載(延遲加載) 懶加載用什麼技術實現 如何解決session關閉導致的懶加載問題 解決的方案有缺點嗎
答:
懶加載:1. 當具體確定用到某個數據時纔會去加載數據庫,
2. 懶加載使用的是代理技術來完成的,代理類就是加載對象的子類(系統定義的),如果把加載對象設置成final修飾那麼就不能使用懶加載。
3. 當Session關閉時會造成懶加載的問題,可以使用OpenSessionInView模式來完成懶加載問題,通過過濾器來實現,

概念:1 lazy的概念,指在需要數據的時候才發出sql。

11 講講一下hibernate的抓取策略
答:
hibernate的抓取分爲:抓取策略就是抓與當前對象有關聯的實體或集合。
連接抓取 fetch="join":通過select語句使用外連接來加載其關聯實體或集合。 
查詢抓取 fetch="select":在查詢當前班級表後會另外發送一條select語句抓取當前對象關聯實體或集合。
子查詢抓取 fetch="subselect":另外發送一條select語句抓取在前面查詢到的所有實體對象的關聯實體或集合,通過子查詢in完成
批量抓取(batch-size="數量"):給的數量是多少就一次抓取多少條記錄(前提是數據庫中有那麼多記錄)。
12 hibernate如何處理大數據量 
答:
1.使用循環方法進行小量同步來清除緩存,當循環方法加載完指定的數量後就調用flush把數據同步到數據庫,然後調用clear清除緩存。
通過該接口的操作會立刻發送給數據庫,與JDBC的功能一樣。
3.使用Query調用executeUpdate()執行批量更新,
4.使用分頁機制,

13.說明是樂觀鎖,說明是悲觀鎖
樂觀鎖:在數據庫中加一個version(版本號),字段屬性爲int,在讀取數據時把版本號一同讀出,在更新數據後數據庫自動爲版本號加1,
如果在更新過程中出現什麼情況而沒有及時提交,而此時另一個人對此數據進行了更新,更新完後版本號自動加1,
此時數據庫中的版本號已經比之前讀出的版本號大1,如果提交的版本號小於或等於數據庫中的版本號那麼就會報當前數據已過期。
* 爲什麼等於也過期呢?
* 因爲提交時版本號會自動加1後再去與數據庫中的版本號做比較。
悲觀鎖:鎖住之後在沒有提交之前任何人都改變不了原數據,但是有一個問題:在提交之後,
之前沒提交時別人修改過但是沒有修改成功的數據就會修改成功,使用LockMode.UPGRADE完成。

14 你是如何進行Hibernate的性能優化的
答:
在使用查詢數據時第一次使用list方法查詢,以後使用迭代方式查詢,因爲list查詢它只會把數據放入緩存中而不會使用緩存,
迭代器查詢出的數據它不會放入緩存但是會使用緩存,有一點注意,迭代器不使用查詢緩存,list會使用查詢緩存。

19 hibernate查詢單條記錄有幾種方法
答:
唯一記錄使用Session調用uinqueResult方法,當你確定本次查詢只有一條記錄可以用uinqueResult返回一個實體對象。
get方法 load方法。

20 你做項目爲什麼使用hibernate 爲什麼不使用hibernate
答:文檔齊全,全自動的操作,自動生成sql等功能。
使用hibernate有幾方面的好處,它的緩存機制可以爲系統查詢時節省資源,主鍵機制,自動生成sql等性能比較強,使用比較靈活,
而且hibernate還可以在不同數據庫類型的支持,跨數據庫的功能,與底層數據庫分離,可移植。

不使用hibernate是因爲在一些系統裏數據量大或是更新比較頻繁,而這些原因就會因爲hibernate的緩存機制導致系統內存消耗過大,
系統性能下降,還有一些保密性較高的如:財務數據,私人信息等系統也不適合hibernate,不能使用sql的很多功能 存儲過程等。

jdbc與hibernate不能共存,因爲會導致hibernate的緩存失效。

21 用過hibernate註解嗎 說出幾個
答:
@Entity:標記爲持久類映射
@Table:指定表名
@Id
@GeneratedValue
@GenericGenerator:主鍵生成機制
@OneToMany
@ManyToOne
@JoinColumn:關聯字段


其它註解:
@Resource:標註在對象上,可以代替以前的set方法。
@Controller:表示action層。
@Service:表示service層。
@Repository:表示dao層。

22 hibernate爲什麼能跨數據庫?
答:因爲hibernate是ORM模式的框架,方言,實現了跨數據庫的功能,根據配置的方言,產生不同的sql,使用URL通過元數據得到需要使用什麼數據庫。

使用hibernate碰到什麼問題?
1. 大數據量問題。
2. hibernate最好不要與其它系統共存,如:JDBC。
3. 使用一級緩存的問題,當Session關閉后里面的數據就沒有了,因爲不能控制,所以要注意大批量操作數據時可能造成內存溢出。
4. 使用二級緩存的問題,要注意它的命中率,如果命中率太低對系統性能的消耗會很大。
5. 使用緩存都會有存在無效數據的問題,使用緩存應該注意查詢要大於修改,而且數據量不要過大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章