ORM是Object Relation Mapping的縮寫,意思是對象關(guān)系映射,是把數(shù)據(jù)庫中的關(guān)系數(shù)據(jù)映射成為程序中的對象。使用 ORM 的優(yōu)點:提高了開發(fā)效率降低了開發(fā)成本、開發(fā)更簡單更對象化、可移植更強。
Hibernate是持久層框架,通過對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。
1)對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。
2)Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作
3)Hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現(xiàn)透明性。
4)Hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。
1.通過Configuration().configure();讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的讀取并解析映射信息
3.通過config.buildSessionFactory();//創(chuàng)建SessionFactory
4.sessionFactory.openSession();//打開Sesssion
5.session.beginTransaction();//創(chuàng)建事務(wù)Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務(wù)
8.關(guān)閉Session
9.關(guān)閉SesstionFactory
臨時/瞬時狀態(tài):直接 new 出來的對象,該對象還沒被持久化(沒保存在數(shù)據(jù)庫中),不受 Session 管理。
持久化狀態(tài):當(dāng)調(diào)用 Session 的 save/saveOrupdate/get/load/list 等方法的時候,對象就是持久化狀態(tài)。
游離狀態(tài):Session 關(guān)閉之后對象就是游離狀態(tài)。
數(shù)據(jù)查詢時,沒有 OID 指定的對象,get() 返回 null;load() 返回一個代理對象。
load()支持延遲加載;get() 不支持延遲加載。
getCurrentSession 會綁定當(dāng)前線程,而 openSession 則不會。
getCurrentSession 事務(wù)是 Spring 控制的,并且不需要手動關(guān)閉,而 openSession 需要我們自己手動開啟和提交事務(wù)。
在定義數(shù)據(jù)庫和數(shù)據(jù)庫屬性的文件applicationConfig.xml里面,把hibernate.show_sql 設(shè)置為true,這樣生成的SQL就會在控制臺出現(xiàn)了。注意:這樣做會加重系統(tǒng)的負擔(dān),不利于性能調(diào)優(yōu)。
都是用于將對象保存到數(shù)據(jù)庫中的方法。
1)save()只能執(zhí)行INSERT操作,會立即執(zhí)行Sql insert,save()的返回值是一個Serializable對象;
2)saveOrUpdate()可以進行 記錄的INSERT和UPDATE;
3)persist不保證立即執(zhí)行,可能要等到flush;persist不更新緩存;persist()方法返回值為void;
通過設(shè)置屬性lazy進行設(shè)置是否需要懶加載。當(dāng)Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時,對象才存在與內(nèi)存中,就實現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。
Hibernate 常用的緩存有一級緩存和二級緩存:
一級緩存:也叫 Session 緩存,只在 Session 作用范圍內(nèi)有效,不需要用戶干涉,由 hibernate 自身維護,可以通過:evict(object)清除 object 的緩存;clear()清除一級緩存中的所有緩存;flush()刷出緩存;
二級緩存:應(yīng)用級別的緩存,在所有 Session 中都有效,支持配置第三方的緩存,如:EhCache。
通過配置文件中的many-to-one、one-to-many、many-to-many來實現(xiàn)類之間的關(guān)聯(lián)關(guān)系的。
可以將Hibernate的實體類定義為final類,但不建議這么做。因為Hibernate會使用代理模式在延遲關(guān)聯(lián)的情況下提高性能,如果你把實體類定義成final類之后,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。
Integer 類型為對象,它的值允許為 null,而 int 屬于基礎(chǔ)數(shù)據(jù)類型,值不能為 null。
Hibernate框架會調(diào)用這個默認構(gòu)造方法來構(gòu)造實例對象,即Class類的newInstance方法 ,這個方法就是通過調(diào)用默認構(gòu)造方法來創(chuàng)建實例對象的 。如果在實體類中找不到無參數(shù)的構(gòu)造器,這個方法就會拋出一個InstantiationException異常。
Hibernate在做插入操作時會把要操作的對象全部放到自身的內(nèi)部緩存來進行管理。當(dāng)海量數(shù)據(jù)插入的時候,會有很多對象被納入內(nèi)部緩存,就可能出現(xiàn)OutOfMemoryError(內(nèi)存溢出異常),因此最好做到如下三點:
1.做海量數(shù)據(jù)批量操作一定要關(guān)閉控制臺顯示執(zhí)行的sql語句;
2.繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的,也是最快的;
3.如果還是使用Hibernate API ,使用分段插入。
1)HQL優(yōu)化
2)API的正確使用(如根據(jù)不同的業(yè)務(wù)類型選用不同的集合及查詢API)
3)主配置參數(shù)(日志,查詢緩存,fetch_size, batch_size等)
4)映射文件優(yōu)化(ID生成策略,二級緩存,延遲加載,關(guān)聯(lián)優(yōu)化)
5)一級緩存的管理
6)針對二級緩存,還有許多特有的策略
A. 表對應(yīng)類
B. 記錄對應(yīng)對象
C. 表的字段對應(yīng)類的屬性
D. 表之間的參考關(guān)系對應(yīng)類之間的依賴關(guān)系
A. 對于每個數(shù)據(jù)庫事務(wù),應(yīng)該創(chuàng)建一個SessionFactory對象
B. 一個SessionFactory對象對應(yīng)一個數(shù)據(jù)庫存儲源。
C. SessionFactory是重量級的對象,不應(yīng)該隨意創(chuàng)建。如果系統(tǒng)中只有一個數(shù)據(jù)庫存儲源,只需要創(chuàng)建一個。
D. SessionFactory的load()方法用于加載持久化對象
A. HQL與SQL沒什么差別
B. HQL面向?qū)ο螅鳶QL操縱關(guān)系數(shù)據(jù)庫
C. 在HQL與SQL中,都包含select,insert,update,delete語句
D. HQL僅用于查詢數(shù)據(jù),不支持insert,update和delete語句
A. load()
B. save()
C. delete()
D. update()
E. open()
F. close()
tx = session.beginTransaction();
Customer c1=(Customer)session.load(Customer.class,new Long(1));
Customer c2=(Customer)session.load(Customer.class,new Long(1));
System.out.println(c1==c2);
tx.commit();
session.close();
A. 運行出錯,拋出異常A. none
B. save
C. delete
D. save-update
以下程序代碼對Customer的name屬性修改了兩次:(B)
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
customer.setName(\"Jack\");
customer.setName(\"Mike\");
tx.commit();
A. 0 A. 臨時狀態(tài)
B. 獨立狀態(tài)
C. 游離狀態(tài)
D. 持久化狀態(tài)