吐血推薦常見面試問題_第1頁
吐血推薦常見面試問題_第2頁
吐血推薦常見面試問題_第3頁
吐血推薦常見面試問題_第4頁
吐血推薦常見面試問題_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、hibernate面試題(一)  2009-09-03 14:51:24|  分類: hibernate |  標簽: |字號大中小 訂閱 Hibernate工作原理及為什么要用? 原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.打開Sesssion 4.創(chuàng)建事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory 為什么要用: 1. 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復性代碼。 2. H

2、ibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現(xiàn)透明性。 4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數(shù)據(jù)庫,從一對一到多對多的各種復雜關系。 2Hibernate是如何延遲加載? 1. Hibernate2延遲加載實現(xiàn):a)實體對象 b)集合(Collection) 2. Hibernate3 提供了屬性的延遲加載功能 當Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內存中,當程序真正對數(shù)據(jù)的操作時,對

3、象才存在與內存中,就實現(xiàn)了延遲加載,他節(jié)省了服務器的內存開銷,從而提高了服務器的性能。 3Hibernate中怎樣實現(xiàn)類之間的關系?(如:一對多、多對多的關系) 類與類之間的關系主要體現(xiàn)在表與表之間的關系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、 4說下Hibernate的緩存機制 1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存 2. 二級緩存: a) 應用及緩存 b) 分布式緩存 條件:數(shù)據(jù)不會被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、

4、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關鍵數(shù)據(jù) c) 第三方緩存的實現(xiàn) 5Hibernate的查詢方式 Sql、Criteria,object comptosition Hql: 1、 屬性查詢 2、 參數(shù)查詢、命名參數(shù)查詢 3、 關聯(lián)查詢 4、 分頁查詢 5、 統(tǒng)計函數(shù) 6如何優(yōu)化Hibernate? 1.使用雙向一對多關聯(lián),不使用單向一對多 2.靈活使用單向一對多關聯(lián) 3.不用一對一,用多對一取代 4.配置對象緩存,不使用集合緩存 5.一對多集合使用Bag,多對多集合使用Set 6. 繼承類使用顯式多態(tài) 7. 表字段要少,表關聯(lián)不要怕多,有二級緩存撐腰 /答案二:hibernate工作原理:1、通過

5、Configuration().configure();讀取并解析hibernate.cfg.xml配置文件。2、由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取解析映射信息。3、通過config.buildSessionFactory();/得到sessionFactory。4、sessionFactory.openSession();/得到session。5、session.beginTransaction();/開啟事務。6、persistent operate;6、sessio

6、n.getTransaction().commit();/提交事務7、關閉session;8、關閉sessionFactory;hibernate優(yōu)點:1、封裝了jdbc,簡化了很多重復性代碼。2、簡化了DAO層編碼工作,使開發(fā)更對象化了。3、移植性好,支持各種數(shù)據(jù)庫,如果換個數(shù)據(jù)庫只要在配置文件中變換配置就可以了,不用改變hibernate代碼。4、支持透明持久化,因為hibernate操作的是純粹的(pojo)java類,沒有實現(xiàn)任何接口,沒有侵入性。所以說它是一個輕量級框架。hibernate延遲加載:get不支持延遲加載,load支持延遲加載。1、hibernate2對 實體對象和集合

7、 實現(xiàn)了延遲加載2、hibernate3對 提供了屬性的延遲加載功能hibernate延遲加載就是當使用session.load(User.class, 1)或者session.createQuery()查詢對象或者屬性的時候這個對象或者屬性并沒有在內存中,只有當程序操作數(shù)據(jù)的時候,才會存在內存中,這樣就實現(xiàn)延遲加載,節(jié)省了內存的開銷,從而提高了服務器的性能。Hibernate的緩存機制一級緩存:session級的緩存也叫事務級的緩存,只緩存實體,生命周期和session一致。不能對其進行管理。不用顯示的調用。二級緩存:sessionFactory緩存,也叫進程級的緩存,使用第3方插件實現(xiàn)的,

8、也值緩存實體,生命周期和sessionFactory一致,可以進行管理。首先配置第3放插件,我們用的是EHCache,在hibernate.cfg.xml文件中加入<property name="hibernate.cache.user_second_level_cache">true</property>在映射中也要顯示的調用,<cache usage="read-only"/>二級緩存之查詢緩存:對普通屬性進行緩存。如果關聯(lián)的表發(fā)生了修改,那么查詢緩存的生命周期也結束了。在程序中必須手動啟用查詢緩存:query.s

9、etCacheable(true);優(yōu)化Hibernate1、使用一對多的雙向關聯(lián),盡量從多的一端維護。2、不要使用一對一,盡量使用多對一。3、配置對象緩存,不要使用集合緩存。4、表字段要少,表關聯(lián)不要怕多,有二級緩存撐腰。Hibernate面試題(二)  2009-09-03 15:04:47|  分類: hibernate |  標簽: |字號大中小 訂閱 (1)一般情況下,關系數(shù)據(jù)模型與對象模型之間有哪些匹配關系(多選)A)表對應類B)記錄對應對象C)表的字段對應類的屬性D)表之間的參考關系對應類之間的依賴關系(2)以

10、下關于SessionFactory的說法哪些正確?(多選)A)對于每個數(shù)據(jù)庫事務,應該創(chuàng)建一個SessionFactory對象B)一個SessionFactory對象對應一個數(shù)據(jù)庫存儲源。C)SessionFactory是重量級的對象,不應該隨意創(chuàng)建。如果系統(tǒng)中只有一個數(shù)據(jù)庫存儲源,只需要創(chuàng)建一個。D)SessionFactory的load()方法用于加載持久化對象(3)Customer類中有一個Set類型的orders屬性,用來存放Order訂單對象,在Customer.hbm.xml文件中,用哪個元素映射orders屬性?A) B) C) D)<:property>(4)元素有

11、一個cascade屬性,如果希望Hibernate級聯(lián)保存集合中的對象,casecade屬性應該取什么值?(單選)A)noneB)saveC)deleteD)save-update(5)以下哪些屬于Session的方法?A)load()B)save()C)delete()D)update()E)open()F)close()(6)以下程序的打印結果是什么?(單選)1. tx = session.beginTransaction();   2. Customer c1=(Customer)session.load(Customer.class,new

12、60;Long(1);   3. Customer c2=(Customer)session.load(Customer.class,new Long(1);   4. System.out.println(c1=c2);   5. mit();   6. session.close(); A)運行出錯,拋出異常B)打印falseC)打印true(7)以下程序代碼對Customer的name屬性修改了兩次:1. tx = session.beginTransaction();   2. Cust

13、omer customer=(Customer)session.load(Customer.class,   3. new Long(1);   4. customer.setName("Jack");   5. customer.setName("Mike");   6. mit(); 執(zhí)行以上程序,Hibernate需要向數(shù)據(jù)庫提交幾條update語句?(單選)A)0 B)1 C)2 D)3(8)在持久化層,對象分為哪些狀態(tài)?(多選)A)臨時狀態(tài)B)獨立狀態(tài)C)游離狀態(tài)D)持久化狀

14、態(tài)(9)對于以下程序,Customer對象在第幾行變?yōu)槌志没癄顟B(tài)?(單選)1. Customer customer=new Customer(); /line1   2. customer.setName("Tom"); /line2   3. Session session1=sessionFactory.openSession(); /line3   4. Transaction tx1 = session1.beginTransaction();&#

15、160;/line4   5. session1.save(customer); /line4   6. mit(); /line5   7. session1.close(); /line6 A) line1 B)line2 C)line3 D)line4 E)line5 F)line6(10)對于以下程序,Customer對象在第幾行變?yōu)橛坞x狀態(tài)?(單選)1. Customer customer=new Customer(); /line1   2. customer.setNam

16、e("Tom"); /line2   3. Session session1=sessionFactory.openSession(); /line3   4. Transaction tx1 = session1.beginTransaction(); /line4   5. session1.save(customer); /line4   6. mit(); /line5   7. session1.close(); /

17、line6 A) line1 B)line2 C)line3 D)line4 E)line5 F)line6(11)以下哪一種檢索策略利用了外連結查詢?(單選)A)立即檢索 B)延遲檢索 C)迫切左外連結檢索(12)假設對Customer類的orders集合采用延遲檢索策略,編譯或運行以下程序,會出現(xiàn)什么情況(單選)1. Session session=sessionFactory.openSession();   2. tx = session.beginTransaction();   3. Customer custo

18、mer=(Customer)session.get(Customer.class,new Long(1);   4. mit();   5. session.close();   6. Iterator orderIterator=customer.getOrders().iterator(); A)編譯出錯 B)編譯通過,并正常運行 C)編譯通過,但運行時拋出異常(13)關于HQL與SQL,以下哪些說法正確?(多選)A)HQL與SQL沒什么差別B)HQL面向對象,而SQL操縱關系數(shù)據(jù)庫C)在HQL與SQL中,都包含select,in

19、sert,update,delete語句D)HQL僅用于查詢數(shù)據(jù),不支持insert,update和delete語句(14)事務隔離級別是由誰實現(xiàn)的?(單選)A)Java應用程序 B)Hibernate C)數(shù)據(jù)庫系統(tǒng) D)JDBC驅動程序(15)悲觀鎖與樂觀鎖,哪個具有較好的并發(fā)性能?(單選)A)悲觀鎖 B)樂觀鎖答案:(1)A,B,C (2)B,C (3)A (4)D (5)A,B,C,D,F (6)C (7)B (8)A,C,D (9)D   (10)F (11)C (12)C (13)B,D (14)C (15)BHibernate面試題(三)  

20、;2009-09-03 15:29:20|  分類: hibernate |  標簽: |字號大中小 訂閱 Hibernate對象的三種狀態(tài)是什么? 瞬時態(tài)(Transient)、 持久態(tài)(Persistent)、脫管態(tài)(Detached)。處于持久態(tài)的對象也稱為PO(Persistence Object),瞬時對象和脫管對象也稱為VO(Value Object)。瞬時態(tài)由new命令開辟內存空間的java對象,eg. Person person = new Person(”amigo”, “女”);如果沒有變量對該對象進行引用,它將被java虛

21、擬機回收。瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫的數(shù)據(jù)有任何關聯(lián)關系,在Hibernate中,可通過session的save()或 saveOrUpdate()方法將瞬時對象與數(shù)據(jù)庫相關聯(lián),并將數(shù)據(jù)對應的插入數(shù)據(jù)庫中,此時該瞬時對象轉變成持久化對象。持久態(tài)處于該狀態(tài)的對象在數(shù)據(jù)庫中具有對應的記錄,并擁有一個持久化標識。如果是用hibernate的delete()方法,對應的持久對象就變成瞬時對象,因數(shù)據(jù)庫中的對應數(shù)據(jù)已被刪除,該對象不再與數(shù)據(jù)庫的記錄關聯(lián)。當一個session執(zhí)行close()或clear()、evict()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象

22、,此時該對象雖然具有數(shù)據(jù)庫識別值,但它已不在HIbernate持久層的管理之下。持久對象具有如下特點:1. 和session實例關聯(lián);2. 在數(shù)據(jù)庫中有與之關聯(lián)的記錄。脫管態(tài)當與某持久對象關聯(lián)的session被關閉后,該持久對象轉變?yōu)槊摴軐ο?。當脫管對象被重新關聯(lián)到session上時,并再次轉變成持久對象。脫管對象擁有數(shù)據(jù)庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。脫管對象具有如下特點:1. 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當?shù)臅r候將它回收;2.   比瞬時對象多了一個數(shù)據(jù)庫記錄標識值。Detached

23、Object(游離對象)有什么好處? Detached Object(游離對象)可以傳遞到任何層直到表現(xiàn)層而不是用任何DTO(Data Transfer Objects). 然后你還可以重新把游離對象賦給另外一個Session. jdbc、hibernate、ibatis的區(qū)別? jdbc:手動  手動寫sql  delete、insert、update要將對象的值一個一個取出傳到sql中,不能直接傳入一個對象。  select:返回的是一個resultset,要從ResultSet中一行一行、一個字段一個字段的取出,然后封裝到一個對

24、象中,不直接返回一個對象。 ibatis的特點:半自動化  sql要手動寫  delete、insert、update:直接傳入一個對象  select:直接返回一個對象    hibernate:全自動  不寫sql,自動封裝  delete、insert、update:直接傳入一個對象  select:直接返回一個對象 Hibernate如何實現(xiàn)數(shù)據(jù)表映射的繼承關系? 1、兩個表,子類重復父類的屬性。 2、一個表

25、,子類父類共用一個表    <class name=”Users” table=”users” discriminator-value=”Users”>   <discriminator column=”DISCRIMINATOR_USERTYPE” type=”string”/><subclass name=”admin” discriminator-value=”admin”>           

26、;<property name=”adminRemark” column=”admin_remark” type=”string” />        </subclass>    </class> 3、兩個表,子類引用父類的主鍵,享用公共的字段或屬性。    <class name=”Users” table=”users”>       

27、; <id name=”userid” column=”USERID” type=”string”>            <generator class=”assigned”/>        </id>        <property name=”pwd” column=”pwd” type=”st

28、ring” />   <joined-subclass name=”Guest” table=”guest”>    <key column=”USERID”/>         <property name=”guestRemark” column=”guest_remark” type=”string” />        </joined-su

29、bclass></class>批量刪除 Query query=session.createQuery(”update”或”delete”); query.executeUpdate();Hibernate中Query對象的使用 1 個或多個屬性查詢: Query query=session.createQuery(”select customername,customerid from Customer”) List l=query.list(); For(int i=0;i<l.size();i+) Obe

30、jct object=(Object)l.get(i); Object0  object1分組: “select count(*),productname from Product group by productname order by productname”取值與屬性一樣配置的查詢,在*.hbm.xml中 <query name=”sql”>    <!CDATA     from Product where productid=:productid 

31、0;  ></query> Query query=session.getNamedQuery(sql);聯(lián)接1 ”from Customer as customer join fetch customer.buySet”:將多的放到buySet屬性中,得出的結是Customer有一個,Buy有多個聯(lián)接2“from Customer as customer join customer.buySet”:得出的對象,customer與buy是1對1子查詢: ”from Customer as customer where (select c

32、ount(*) from customer.buySet)>1Hibernate中Criteria 和DetachedCriteria的作用是什么? Criteria c=session.createCriteria(Customer.class); /設置條件 c.add(Expression.ge(“字段名”,”值對象”)  ge:>=  gt:>  le:<=  lt:<  eq:= /排序  c.addOrd

33、er(Order.asc(“字段名”) /分頁  c.setFirstResult(1)/從第2行開始提取  c.setMaxResults(5)/返回5行 DetachedCriteria產生時不需要session DetachedCriteria dc= DetachedCriteria.forClass(Customer.class) Criteria c=Dc.getExecutableCriteria(session)Hibernate中數(shù)據(jù)表映射關系主要有什么類型? one-to-many i

34、nverse:主控方,外鍵的關系有誰控制  inverse=false 是主控方,外鍵是由它控制的     inverse=true 是被控方,外鍵與它沒關系  要想實現(xiàn)主控方的控制必須將被控方作為主控方的屬性 cascade:級聯(lián)  主表增從表增  主表修從表修  主表刪從表刪 lazy:延遲  lazy=false:一下將所有的內容取出,不延時(常用)  lazy=true:取出部分

35、內容,其余內容動態(tài)去取  通過get可以取出對方的所有內容hibernate的核心類是什么,它們的相互關系是什么?重要的方法是什么? ConfigurationSessionFactory  Session如下方法   Save   load   Update   Delete      Query q=CreateQuery(“from Customer where customerN

36、ame=:customerName”)   beginTransaction   close   Transaction   Commit()在myeclipse加入hibernate環(huán)境的全過程是什么? 1.Db-browers加入配置連接2.新建工程3.加入hibernate環(huán)境,指定*.hbm.xml及HibernateSessionFactory文件所在的位置 詳細內容參見以前寫的hibernate的第一個小例子 面試中常出現(xiàn)的兩個Hibernate面試題及解答 1.

37、在數(shù)據(jù)庫中條件查詢速度很慢的時候,如何優(yōu)化?1.建索引2.減少表之間的關聯(lián)3.優(yōu)化sql,盡量讓sql很快定位數(shù)據(jù),不要讓sql做全表查詢,應該走索引,把數(shù)據(jù)量大的表排在前面4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量數(shù)據(jù)2.在hibernate中進行多表查詢,每個表中各取幾個字段,也就是說查詢出來的結果集并沒有一個實體類與之對應,如何解決這個問題?解決方案一,按照Object數(shù)據(jù)取出數(shù)據(jù),然后自己組bean解決方案二,對每個表的bean寫構造函數(shù),比如表一要查出field1,field2兩個字段,那么有一個構造函數(shù)就是Bean(type1 filed1,type2 f

38、ield2) ,然后在hql里面就可以直接生成這個bean了。具體怎么用請看相關文檔,我說的不是很清楚。session.load()和session.get()的區(qū)別Session.load/get方法均可以根據(jù)指定的實體類和id從數(shù)據(jù)庫讀取記錄,并返回與之對應的實體對象。其區(qū)別在于:如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException。Load方法可返回實體的代理類實例,而get方法永遠直接返回實體類。load方法可以充分利用內部緩存和二級緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內部緩存中進行數(shù)據(jù)查找,如沒有發(fā)現(xiàn)對應數(shù)據(jù),將

39、越過二級緩存,直接調用SQL完成數(shù)據(jù)讀取。Session在加載實體對象時,將經過的過程:首先,Hibernate中維持了兩級緩存。第一級緩存由Session實例維護,其中保持了Session當前所有關聯(lián)實體的數(shù)據(jù),也稱為內部緩存。而第二級緩存則存在于SessionFactory層次,由當前所有由本 SessionFactory構造的Session實例共享。出于性能考慮,避免無謂的數(shù)據(jù)庫訪問,Session在調用數(shù)據(jù)庫查詢功能之前,會先在緩存中進行查詢。首先在第一級緩存中,通過實體類型和id進行查找,如果第一級緩存查找命中,且數(shù)據(jù)狀態(tài)合法,則直接返回。之后,Session會在當前“NonExis

40、ts”記錄中進行查找,如果“NonExists”記錄中存在同樣的查詢條件,則返回null。 “NonExists”記錄了當前Session實例在之前所有查詢操作中,未能查詢到有效數(shù)據(jù)的查詢條件(相當于一個查詢黑名單列表)。如此一來,如果 Session中一個無效的查詢條件重復出現(xiàn),即可迅速作出判斷,從而獲得最佳的性能表現(xiàn)。對于load方法而言,如果內部緩存中未發(fā)現(xiàn)有效數(shù)據(jù),則查詢第二級緩存,如果第二級緩存命中,則返回。如在緩存中未發(fā)現(xiàn)有效數(shù)據(jù),則發(fā)起數(shù)據(jù)庫查詢操作(Select SQL),如經過查詢未發(fā)現(xiàn)對應記錄,則將此次查詢的信息在“NonExists”中加以記錄,并返回null。根據(jù)映射配置和Select SQL得到的ResultSet,創(chuàng)建對應的數(shù)據(jù)對象。將其數(shù)據(jù)對象納入當前Session實體管理容器(一級緩存)。執(zhí)行Interceptor.onLoad方法(如果有對應的Interceptor)。將數(shù)據(jù)對象納入二級緩存。如果數(shù)據(jù)對象實現(xiàn)了LifeCycle接口,則調用數(shù)據(jù)對象的onLoad方法。返回數(shù)據(jù)對象。Hibernate的主鍵生成機制1) assig

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論