Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30479329
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2009-12-07 15:29:19

: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的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
 
B 什么是Hibernate?
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。
 
CHibernate的关关系有几种?(如:一多、多多的关系)
  many-to-one、one-to-many、many-to-many、 one-to-one
 
D Hibernate存机制
一、hibernate一级缓存
(1)hibernate支持两个级别的缓存,默认只支持一级缓存;
(2)每个Session内部自带一个一级缓存;
(3)某个Session被关闭时,其对应的一级缓存自动清除;
二、hibernate二级缓存
(1) 二级缓存独立于session,默认不开启;
E Hibernate查询方式
本地SQL查询、Criteria、Hql
 
F 如何Hibernate
1.使用双向一对多关联,不使用单向一对多
2.不用一对一,用多对一取代
3.配置对象缓存,不使用集合缓存
 
G 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开发的应用:
不用再考虑公共问题
专心在业务实现上
结构统一,易于学习、维护
新手也可写出好程序
 
H什么要用spring?
Spring是一个轻量级的IOC和AOP框架。
  IOC(控制反转)意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转
  AOP(面向切面),它将那些影响多个类的行为封装到可重用的模块中,面向对象是把问题从同类事物中抽象出来,面向切面是把问题从不同类问题中抽象出来。
 
I:hibernateget()load()
请注意如果没有匹配的数据库记录,load()方法可能抛出无法恢复的异常(unrecoverable exception)。 如果类的映射使用了代理(proxy),load()方法会返回一个未初始化的代理,直到你调用该代理的某方法时才会去访问数据库。 若你希望在某对象中创建一个指向另一个对象的关联,又不想在从数据库中装载该对象时同时装载相关联的那个对象,那么这种操作方式就用得上的了。如果为相应类映射关系设置了batch-size, 那么使用这种操作方式允许多个对象被一批装载(因为返回的是代理,无需从数据库中抓取所有对象的数据)。 如果你不确定是否有匹配的行存在,应该使用get()方法,它会立刻访问数据库,如果没有对应的行,会返回null。
 
J:  [Hibernate目判断:使用save/persist一个,便立即向数据库发insert sql句?
1)      persist把一个瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间。
2)      persist"保证"当它在一个transaction外部被调用的时候并不触发一个Sql Insert,这个功能是很有用的。
3)      save会立即执行Sql insert,不管是不是在transaction内部还是外部.
 
K:[Hibernate目:指出一下代哪里错误使用了Hibernate
背景简介:Board是一个实体类,id是它的主键,name和description是他的两个属性。BoardDao是Board实体的数据访问对象,BoardBo是业务对象,用户提交变更Board对象的请求,由Struts的BoardAction接收,调用BoardBo处理。HibernateUtil.currentSession()用于返回当前请求的Session对象。
//数据访问层代码:BoardDao.java       public Board loadBoard(Long id) {           Session session = HibernateUtil.currentSession();            return session.load(Board.class, id);       }       public void updateBoard(Board board) {           Session session = HibernateUtil.currentSession();            session.update(board);       }       //业务对象层代码:BoardBo.java        private BoardDao boardDao;       public void updateBoard(Long id, String name, String description) {           Board board = boardDao.loadBoard(id);           board.setName(name);           board.setDescription(description);           boardDao.updateBoard(board);       }       //Web控制器代码:BoardAction.java       private BoardBo BoardBo;       public ActionForward execute(   ActionMapping mapping,    ActionForm form,   HttpServletRequest request,    HttpServletResponse response) throws Exception {           String id = request.getParameter("id");           String name = request.getParameter("name");           String description = request.getParameter("description");           boardBo.updateBoard(id, name, description);           return mapping.findForward("update-success");       }  
6.        public void updateBoard(Board board) {  
7.            Session session = HibernateUtil.currentSession();    
              Transaction t=session.beginTransaction();
8.            session.update(board);  
              t.commit();
       }
 
L:简单叙述一下SpringBeanFactoryApplicationContext的差
使用BeanFactory从xml配置文件加载bean:
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class XmlConfigWithBeanFactory {
    public static void main(String[] args) {
        XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(
                "build/beans.xml"));
    }
}
    使用ApplicationConText从xml配置文件加载bean:
public class XmlConfigWithApplication{
    public static void main(String[] args){
        ApplicationContext application = new ClassPathXmlApplicationContext(beans.xml"));
         application.getBean("BeanName");
    }
}
简而言之,BeanFactory提供了配置框架和基本的功能, 而 ApplicationContext为它增加了更强的功能,这些功能中的一些或许更加接近J2EE并且围绕企业级应用。一般来说,ApplicationContext是 BeanFactory的完全超集,任何BeanFactory功能和行为的描述也同样被认为适用于ApplicationContext
  相对于BeanFactory而言,ApplicationContext 提供了以下扩展功能.
  (a) 国际化支持  (b) 资源访问
  (c) 事件传播  (d) 多实例加载
 
M: 写一段程序,使用springAPIclasspath下的一个xml文件,并解析
(1)Resource resource=new ClassPathResource("appcontext.xml");
   BeanFactory factory=new XmlBeanFactory(resource);
   (2)ClassPathXmlApplicationContext appcontext=new ClassPathXmlApplicationContext("appcontext.xml");
  BeanFactory factory=(BeanFactory)appcontext;
 
N:说说hibernate中使用Integer做映射和使用int做映射之有什么差
Integer   code和int   code;的区别:
Integer是对象.     code   =   null;   对象可以为空.  
int   是普通类型,     不可能   =   null.      
根据你的数据库code是可以空的,   故应该映射成Integer.    
你没理由hbm.xml里写Integer,   类里却写int
 
O:使用Spring如何化了Hibernate编码
通过org.springframework.orm.hibernate3.support.HibernateDaoSupport类支持数据库操作,且封装了事务.
public class AccountDAO extends HibernateDaoSupport   implements IAccountDAO{
 
P:Spring如何与Struts集成?
  
  
    
  
  
  
  
    
      attribute="regForm"
      name="regForm"
      path="/reg"
      scope="request"
      type="org.springframework.web.struts.DelegatingActionProxy">
      
    
  
  
      
  
 
Q:如何使用Spring2.0实现声明式事
       class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      
      
              
              
                     read-only="true" />
              
                     read-only="true" />
              
                     read-only="true" />
              
              
      
      
      
      
      
 
R:注入的好是?
程序可扩展性更强;
利于并行开发;
 
S:Spring怎么实现注入?
       xmlns=""
       xmlns:xsi=""
       xsi:schemaLocation=" /spring-beans-2.0.xsd">
    
    
          
    
 
T:“面向方面的好是?
将程序中涉及的公共问题集中解决
 
U:SQL相比,HQL有哪些特点?
   HQL是面向对象的查询语言。select Fw表示查询Fw对象
 
V:如何配置向多一关
        
            
        
        
 
W:如何配置向一多关
        
            
        
        
        
      
      
                
 
X:如何配置双向一多关
        
            
        
        
        
        
            
        
        
        
      
      
                
 
 
其实spring,hibernate,struts面试的话 一般不会问什么太深的问题  一般只是看你用过没有  做过什么什么项目  有个面试官就问我 ssh集成要配置多少个xml文件 哇哈哈 很简单的就答出来了 不过有些同学也问得挺难的 下面是些常问的问题
 
1.MVC,分析一下struts是如何实现MVC的
m:JavaBean 或结合 EJB 组件或者pojo构成
c:Action 来实现
v:一组 JSP 文件及其标签构成。
2.struts中的几个关键对象的作用
Action:控制器类,
ActionForm:表单对象,
DynaValidatorForm:
动态form,ActonMapping:
配置文件中action节点的信息..
3.Hibernate有哪几种查询数据的方式
hql查询,sql查询,条件查询
4.load()和get()的区别
hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundEcception;所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理(load时候之查询一级缓存,不存在则创建代理)。get()现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
5.spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
声明事务和编程事务
隔离级别:
- DEFAULT使用数据库默认的隔离级别
- READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题
- READ_COMMITTED会出现重复读和幻影读
- REPEATABLE_READ会出现幻影读
- SERIALIZABLE最安全,但是代价最大,性能影响极其严重
和传播行:
- REQUIRED存在事务就融入该事务,不存在就创建事务
- SUPPORTS存在事务就融入事务,不存在则不创建事务
- MANDATORY存在事务则融入该事务,不存在,抛异常
- REQUIRES_NEW总是创建新事务
- NOT_SUPPORTED存在事务则挂起,一直执行非事务操作
- NEVER总是执行非事务,如果当前存在事务则抛异常
- NESTED嵌入式事务
6.Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。
getHiberanteTemplate里面提供了save,update,delete,find等方法。
简单说一个:如果配置了声明式事务,当执行getHibernateTemplate的各种方法的时候,事务会
自动被加载
如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了hibernate的
autocommit=true
7.spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
spring事务分两种形式,声明式事务和编程式事务,spring提供了一个事务的接口
PaltformTractionManager接口,针对不同的事务,spring进行了不同的实现,对hibernate事务
的实现HIbernateTractionManager,对JDBC的JdbcTractionManager,
DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三
个方法,获取事务,提交和回滚的方法。
8.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
阅读(2094) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~