hibernate运行原理

1.Struts,Hibernate,Spring综合在一起时什么状态?Struts,hibernate,Spring综合在一起基本上会这么来用(用一个图来描述):


执行步骤:

  1. Client端它发起一个request(请求)给我的app server(服务端)
  2. 这个app server会将我们的请求发给Struts(调用doFilter进行分发)
  3. 找到对应的action,会执行Action对应的方法,比如execute
  4. Action会调用service层进行业务逻辑上的处理。
  5. 在进行业务逻辑处理的时候,会调用DAO层,在DAO层会访问我们的实体类model,然后DAO会帮我们把实体类进行persistence到数据库
  6. –-返回
  7. DAO会将结果返回到Serivce
  8. Service会将结果返回给Action
  9. Action会把结果返回给Struts的Filter
  10. Struts的Filter会通过配置文件找到对应的JSP
  11. 视图(jsp)通过app server反馈给我们的客户端。

 Spring去哪了呢?spring会贯穿在整个过程里面。Spring会帮action把service注入到action里面去,Spring会帮service把DAO注入到里面Servcie里面去,Spring还会针对service进行声明式的事物管理,这就是Spring的作用。

 

 

2.用了hibernate的结果就是当你拿到Session对象之后,以后的操作就非常简单,直接save(Student s),它内部执行了什么SQL语句跟我们没关系,全有Hibernate帮我们做了,”save(Student s)“这种写法是面向对象的,所以我们把面向对象的写法覆盖在了原来的面向关系数据库上,我们就不用再写面向关系的SQL语句了,我们只用面向对象的写法来操作数据库。

我们现在有一个Client端,然后Client new一个对象Student,new完这个对象之后,我想把它存到数据库里面,那么怎么做呢?采用Hibernate 它的写法是这样的,根本不用牵扯JDBC了,它创建好这个student之后,它(Client)想把这个student存到数据库,它就会跟hibernate打交道:①读取Hibernate.xml生成Configuration,②调用Configuration的buildSessionFactory方法创建一个SessionFactory对象,③Client端调用SessionFactory的OpenSession()方法创建一个Session对象。

 

 

3.Hibernate这个框架的原理:其实就是将我们的Object映射与relationship数据库相关的SQL语句,以及将与数据库相关的SQL语句组装成对象。

 

4.Hibernate自带的slf4j-api-1.5.8.jar只是定义了slf的接口,并没有slf的实现,所以还要自己下载slf4j,解压包里面的:slf4j-nop-1.5.8.jar

 

5.什么是O/R Mapping?

就是一大推的类库,我们调用它的时候,用面向对象的方式来调用,hibernate帮我们翻译成面向关系的方法

 

6.常见的O/R Mapping框架

hibernate, toplink,JDO

 

7.Hibernate3.0以后开始支持Annotataion.

8.想要输入@符号eclipse就自动提示:选择Preference --> java/editor/context Assist --> 修改Auto Activation triggers for java

 

9.理解JPA

JPA下面统领着一些具体的框架,这些具体的框架全部都实现了JPA规范;JPA就是一个标准,规范,下面的框架全部实现了这一标准(这个很像JDBC)

 

9.1(扩展)理解JDBC

JDBC只是规范,Oracle的驱动包(ojdbc.jar),SQL Server的驱动包,MySQL的驱动包都是其具体实现

9.2(扩展)理解SLF

Hibernate目前用到的一个日志框架SLF,SLF是一个规范(和JPA,JDBC类似)

①slf是一个日志框架,具体的日志实现你可以用各种各样的实现,你可以用slf自己的日志实现slf4j nodep,你也可以用log4j的日志实现,还可以用jdk logging API,还可以用apache commons-logging,而Hibernate3.3.2用的是slf4j

②当然我们可以在我们自己的项目里配slf自己的实现slf4j,但是很少用(不流行),所以我们可以把slf4j的接口对上log4j自己的实现,这是完全可以的。

slf4j-api-1.5.8.jar是slf的接口    对应是我们的接口slf

slf4j-nop-1.5.8.jar   对应就是slf的实现

 

如何把实现换成log4j的?

下面我们想把实现换成log4j的,不想用slf的(因为slf不是特别流行),我们现在实现换成log4j的。

将项目中的slf的实现(即slf4j-nop-1.5.8.jar)换成log4j-1.2.15.jar(log4j的实现);但是slf4j-api不能自动的和log4j对应起来,它们中间需要转换器,把slf的接口转换成log4j的接口,那么我们就需要到slf4j的包中引入这个转换器slf4j-log4j12-1.5.8.jar(这个jar是用于在slf4j和log4j中间做转换的jar包);从slf4j的包中还可以看出,可以将slf接口转换成与commons-logging对应的接口,即slf4j-jcl-1.5.8.sources.jar,但是这样还不行,还需要一个log4j的配置文件。

 

①show_sql 是hibernate.cfg.xml配置文件的配置,ddl日志跟hibernate.cfg.xml的配置文件没关系,是hibernate的类执行过程当中能够显示的信息。DDL语句在hibernate.cfg.xml中是配置不出来的,只能用日志输出。

show_sql配置是说是否需要打印日志而已。


 

 

 

 

10.Hibernate如果你想使用Annoation的话,可以参考文档

①Hibernate 自带的Hibernate-distribution-3.3.2.GA\documentation\manual

②Hibernate -annotation 自带的doc\references\zh_ch\html_single\index.html

③纯中文的Annotation帮助文档Hibernate-3.2.0_Reference_zh_cn.chm (网上下载)

 

 

 

猜你喜欢

转载自weigang-gao.iteye.com/blog/2201323