Hibernate面試總結


SSH原理總結

Hibernate工作原理及為什么要用:

原理:

hibernate,通過對jdbc進行封裝,對 java類和 關系數據庫進行mapping,實現了對關系數據庫的面向對象方式的操作,改變了傳統的jdbc + sql操作數據的方式,從而使開發人員可以用更多精力進行對象方面的開發

1.讀取並解析配置文件

2.讀取並解析映射信息,創建SessionFactory

3.打開Sesssion

4.創建事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

為什么要用:

1.    對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

2.    Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3.    hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

什么是Hibernate延遲加載

延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。

 

Hibernate中類之間的關聯關系有幾種(如:一對多、多對多的關系)

  many-to-one、one-to-many、many-to-many、 one-to-one

 

Hibernate的緩存機制

一、hibernate一級緩存

(1)hibernate支持兩個級別的緩存,默認只支持一級緩存;

(2)每個Session內部自帶一個一級緩存;

(3)某個Session被關閉時,其對應的一級緩存自動清除;

二、hibernate二級緩存

(1) 二級緩存獨立於session,默認不開啟;

題目5: Hibernate的查詢方式

本地SQL查詢、Criteria、Hql

 

優化Hibernate

1.使用雙向一對多關聯,不使用單向一對多

2.不用一對一,用多對一取代

3.配置對象緩存,不使用集合緩存

 

Struts工作機制?為什么要使用Struts?

工作機制:

Struts的工作流程:

在web應用啟動時就會加載初始化ActionServlet,ActionServlet從

struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象

當ActionServlet接收到一個客戶請求時,將執行如下流程.

 -(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在就返回請求路徑無效信息;

 -(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;

 -(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;

 -(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;

 -(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的 Action實例不存在,就先創建這個實例,然后調用Action的execute()方法;

 -(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給 ActionForward對象指向的JSP組件;

 -(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;

 

為什么要用:

1. JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂。

2. 基於Struts開發的應用:

不用再考慮公共問題

專心在業務實現上

結構統一,易於學習、維護

新手也可寫出好程序

 

為什么要用spring

Spring是一個輕量級的IOC和AOP框架。

 IOC(控制反轉)意味着將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉

 AOP(面向切面),它將那些影響多個類的行為封裝到可重用的模塊中,面向對象是把問題從同類事物中抽象出來,面向切面是把問題從不同類問題中抽象出來。

 

1. hibernate中get()與load()區別

 請注意如果沒有匹配的數據庫記錄,load()方法可能拋出無法恢復的異常(unrecoverable exception)。如果類的映射使用了代理(proxy),load()方法會返回一個未初始化的代理,直到你調用該代理的某方法時才會去訪問數據庫。若你希望在某對象中創建一個指向另一個對象的關聯,又不想在從數據庫中裝載該對象時同時裝載相關聯的那個對象,那么這種操作方式就用得上的了。如果為相應類映射關系設置了batch-size,那么使用這種操作方式允許多個對象被一批裝載(因為返回的是代理,無需從數據庫中抓取所有對象的數據)。如果你不確定是否有匹配的行存在,應該使用get()方法,它會立刻訪問數據庫,如果沒有對應的行,會返回null。

 

判斷:使用save/persist一個對象時,便立即向數據庫發送執行insert sql語句?

1) persist把一個瞬態的實例持久化,但是並"不保證"標識符被立刻填入到持久化實例中,標識符的填入可能被推遲到flush的時間。

2) persist"保證"當它在一個transaction外部被調用的時候並不觸發一個Sql Insert,這個功能是很有用的。

3) save會立即執行Sql insert,不管是不是在transaction內部還是外部.

 

指出一下代碼哪里錯誤使用了Hibernate。

背景簡介:Board是一個實體類,id是它的主鍵,name和description是他的兩個屬性。BoardDao是Board實體的數據訪問對象,BoardBo是業務對象,用戶提交變更Board對象的請求,由Struts的BoardAction接收,調用BoardBo處理。HibernateUtil.currentSession()用於返回當前請求的Session對象。

//數據訪問層代碼:BoardDao.java 

publicBoardloadBoard(Longid){ 

Sessionsession=HibernateUtil.currentSession(); 

returnsession.load(Board.class,id); 

publicvoidupdateBoard(Boardboard){ 

Sessionsession=HibernateUtil.currentSession(); 

session.update(board); 

 

//業務對象層代碼:BoardBo.java 

privateBoardDaoboardDao; 

publicvoidupdateBoard(Longid,Stringname,Stringdescription){ 

Boardboard=boardDao.loadBoard(id); 

board.setName(name); 

board.setDescription(description); 

boardDao.updateBoard(board); 

 

//Web控制器代碼:BoardAction.java 

privateBoardBoBoardBo; 

publicActionForwardexecute( 

ActionMappingmapping, 

ActionFormform, 

HttpServletRequestrequest, 

HttpServletResponseresponse)throwsException{ 

Stringid=request.getParameter("id"); 

Stringname=request.getParameter("name"); 

Stringdescription=request.getParameter("description"); 

boardBo.updateBoard(id,name,description); 

returnmapping.findForward("update-success"); 

}

 public void updateBoard(Board board) {

Session session = HibernateUtil.currentSession();

 Transaction t=session.beginTransaction();

 session.update(board);

 t.commit();

 }

 

簡單敘述一下Spring中BeanFactory與ApplicationContext的差別

使用BeanFactory從xml配置文件加載bean:

importorg.springframework.beans.factory.xml.XmlBeanFactory;

importorg.springframework.core.io.FileSystemResource;

 

publicclassXmlConfigWithBeanFactory{

 

publicstaticvoidmain(String[]args){

XmlBeanFactoryfactory=newXmlBeanFactory(newFileSystemResource(

"build/beans.xml"));

 

}

}

使用ApplicationConText從xml配置文件加載bean:

publicclassXmlConfigWithApplication{

 

publicstaticvoidmain(String[]args){

ApplicationContextapplication=newClassPathXmlApplicationContext(beans.xml"));

application.getBean("BeanName");

}

}

簡而言之,BeanFactory提供了配置框架和基本的功能, 而 ApplicationContext為它增加了更強的功能,這些功能中的一些或許更加接近J2EE並且圍繞企業級應用。一般來說,ApplicationContext是 BeanFactory的完全超集,任何BeanFactory功能和行為的描述也同樣被認為適用於ApplicationContext

相對於BeanFactory而言,ApplicationContext 提供了以下擴展功能.

 (a) 國際化支持 (b) 資源訪問

 (c) 事件傳播 (d) 多實例加載

2. 寫一段程序,使用springAPI讀取classpath下的一個xml文件,並解析

(1)Resource resource=new ClassPathResource("appcontext.xml");

 BeanFactory factory=new XmlBeanFactory(resource);

 

 (2)ClassPathXmlApplicationContext appcontext=new ClassPathXmlApplicationContext("appcontext.xml");

 BeanFactory factory=(BeanFactory)appcontext;

 

 

在hibernate中使用Integer做映射和使用int做映射之間有什么差別

Integer code和int code;的區別:

Integer是對象. code = null; 對象可以為空.

int 是普通類型, 不可能 = null.

根據你的數據庫code是可以空的, 故應該映射成Integer.

你沒理由hbm.xml里寫Integer, 類里卻寫int

 

(1)使用Spring如何簡化了Hibernate編碼?

通過org.springframework.orm.hibernate3.support.HibernateDaoSupport類支持數據庫操作,且封裝了事務.

public class AccountDAO extends HibernateDaoSupport implements IAccountDAO{

 

(2)Spring如何與Struts集成?

<xml version="1.0" encoding="UTF-8">

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

 

<struts-config>

 <data-sources />

 <form-beans >

 <form-bean name="regForm" type="demo.form.RegForm" />

 

 </form-beans>

 <global-exceptions />

 <global-forwards />

 <action-mappings >

 <action

 attribute="regForm"

 name="regForm"

 path="/reg"

 scope="request"

 type="org.springframework.web.struts.DelegatingActionProxy">

 <forward name="ok" path="/ok.jsp" />

 </action>

 </action-mappings>

 

 <message-resources parameter="demo.ApplicationResources" />

 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

 <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />

 </plug-in>

</struts-config>

 

如何使用Spring2.0實現聲明式事務?

<!--通用事務管理器-->

<bean id="TransactionManager"

 class="org.springframework.orm.hibernate3.HibernateTransactionManager">

 <property name="sessionFactory" ref="sessionFactory" />

</bean>

 

<!--聲明一個通知,用以指出要管理哪些事務方法及如何管理-->

<tx:advice id="txAdvice" transaction-manager="TransactionManager">

 <tx:attributes>

 <!-- 對get/load/search開頭的方法要求只讀事務 -->

 <tx:method name="get*" propagation="SUPPORTS"

 read-only="true" />

 <tx:method name="load*" propagation="SUPPORTS"

 read-only="true" />

 <tx:method name="search*" propagation="SUPPORTS"

 read-only="true" />

 <!-- 對其它方法要求事務 -->

 <tx:method name="*" propagation="REQUIRED" />

 </tx:attributes>

</tx:advice>

 

<!--聲明一個config,用以將通知和目標業務類關聯起來-->

<aop:config>

 <!-- 添加事務支持,因為前面配置的transactionManager是專對Hibernate的事務管理器-->

 <aop:pointcut id="bizMethods" expression_r_r="execution(* demo.*.*(..))" />

 <!-- 織入 -->

 <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />

</aop:config>

 

(4)依賴注入的好處是?

程序可擴展性更強;

利於並行開發;

 

(5)Spring怎么實現依賴注入?

<xml version="1.0" encoding="UTF-8">

<beans

 xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

 

 <bean id="userdao" class="demo.dao.UserDAO"/>

 

 <bean id="usermanager" class="demo.biz.UserManager">

  <property name="userdao" ref="userdao"/>

 </bean>

</beans>

 

(6)“面向方面編程”的好處是?

將程序中涉及的公共問題集中解決

 

(7)和SQL相比,HQL有哪些特點?

HQL是面向對象的查詢語言。select Fw表示查詢Fw對象

 

(8)如何配置單向多對一關聯?

<class name="Jd" table="TBL_JD">

 <id name="jdid" column="jdid" type="long">

 <generator class="identity" />

 </id>

 <property name="jdname" column="jd" type="string" />

 <many-to-one name="qx" class="Qx" column="qxid" />

</class>

 

(9)如何配置單向一對多關聯?

<class name="Qx" table="TBL_QX">

 <id name="qxid" column="qxid" type="long">

 <generator class="native" />

 </id>

 <property name="qxname" column="qx" type="string" />

 <set name="jds" >

 <key column="qxid" />

 <one-to-many class="Jd" />

 </set>

</class>

(10)如何配置雙向一對多關聯?

<class name="Jd" table="TBL_JD">

 <id name="jdid" column="jdid" type="long">

 <generator class="identity" />

 </id>

 <property name="jdname" column="jd" type="string" />

 <many-to-one name="qx" class="Qx" column="qxid" />

</class>

<class name="Qx" table="TBL_QX">

 <id name="qxid" column="qxid" type="long">

 <generator class="native" />

 </id>

 <property name="qxname" column="qx" type="string" />

 <set name="jds" >

 <key column="qxid" />

 <one-to-many class="Jd" />

 </set>

</class>

 

初步學習者使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM