`
Sando352835800
  • 浏览: 23538 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate启动过程分析

阅读更多
Configuration cfg=new Configuration();
cfg.addClass(User.class);
cfg.configure();
SchemaExport export=new SchemaExport(cfg);
     export.create(true, true);


(1)实例化一个Configuration对象:
       拥有一个SettingsFactory引用,和初始化hibernate.properties文件的信息.

(2)cfg.addClass(User.class):
    类对应的配置文件hbm.xml的属性和对应的资源的捆绑。

(3)cfg.configure();
   解释hibernate.cfg.xml文件

(4)SchemaExport export=new SchemaExport(cfg);
   export.create(true, true);
将表结构导入数据库的工具。
Configuration类 之 1_Configuration对象
用过Hibernate的朋友都知道下面代码的意思,不知道的话,看这篇文章也没意思了!
 
启动代码:  
         Configuration cfg=new Configuration();
cfg.addClass(User.class);
cfg.configure();
SchemaExport export=new SchemaExport(cfg);
     export.create(true, true);


(1)实例化一个Configuration对象
Configuration cfg=new Configuration();
       --->
       public Configuration() {
this( new SettingsFactory() );
  }
--->
           this( new SettingsFactory() );相当于调用
protected Configuration(SettingsFactory settingsFactory) {
          this.settingsFactory = settingsFactory;
           reset();
          }

Configuration是需要将配置信息的设置委托给SettingsFactory, SettingsFactory拥有设置配置信息的方法,比如说,public Settings buildSettings(Properties props)

返回的Settings类:存放系统配置信息转换的对象,比如从Properties得到的信息,转换成对象,然后存入Settings对象。
         (注意:settings是Settings类对象,props是Properties类对象)
String sessionFactoryName = props.getProperty(Environment.SESSION_FACTORY_NAME);
settings.setSessionFactoryName(sessionFactoryName);

Configuration只做自己应该做的事情就是从properties *.cfg.xml读取系统的参数.

     ---> protected void reset() {
classes = new HashMap();
imports = new HashMap();
collections = new HashMap();
tables = new TreeMap();
namedQueries = new HashMap();
namedSqlQueries = new HashMap();
sqlResultSetMappings = new HashMap();
xmlHelper = new XMLHelper();
typeDefs = new HashMap();
propertyReferences = new ArrayList();
secondPasses = new ArrayList();
interceptor = EmptyInterceptor.INSTANCE;
properties = Environment.getProperties();
entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER;
eventListeners = new EventListeners();
filterDefinitions = new HashMap();
// extendsQueue = new ArrayList();
extendsQueue = new HashMap();
auxiliaryDatabaseObjects = new ArrayList();
tableNameBinding = new HashMap();
columnNameBindingPerTable = new HashMap();
namingStrategy = DefaultNamingStrategy.INSTANCE;
sqlFunctions = new HashMap();
}

reset():
除了申请一些HashMap对象,ArrayList对象,TreeMap对象,用来存放XML解释后的信息外,还有XMLHelper用于帮助读取XML,
  EmptyInterceptor用于扩展自定义拦截器。
EventListeners,一个支持对所有session事件的监听器
DefaultNamingStrategy,默认的命名策略。
还有最重要的
properties = Environment.getProperties();
关键是初始化hibernate.properties文件的信息.

Configuration类 之 2_addClass
cfg.addClass(User.class);( Configuration)

public Configuration addClass(Class persistentClass) throws MappingException {

   /**  利用类名称把类的.装换为/然后拼接.hbm.xml这样要求你的配置文件必须和类
* 在一个目录下且名称相同.
      */
String mappingResourceName = persistentClass.getName().replace( '.', '/' ) + ".hbm.xml";
   //记录日志
log.info( "Reading mappings from resource: " + mappingResourceName );

return addResource( mappingResourceName, persistentClass.getClassLoader() );
}

---> addClass(Class):转换类名,然后跳转到addResource(String,ClassLoader)

--->addResource(String,ClassLoader):得到类的配置(比如说:User.hbm.xml)的输入流,然后跳转到addInputStream(InputStream)

---> addInputStream(InputStream):用 XML帮助类 解释传入来的流,解释成org.dom4j.Document的形式,然后跳转到add(org.dom4j.Document)

---> add(org.dom4j.Document):把传入的Document对象交给
              HbmBinder.bindRoot()处理,
      HbmBinder类:hbm.xml的捆绑类。产生hbm.xml对应的属性和对应的资源的捆绑。
Configuration类 之 3--configure()
cfg.configure();

--->直接跳转到configure(“"/hibernate.cfg.xml"”)

--->configure(String):
读取hibernate.cfg.xml的配置信息,得到输入流,
跳转到doConfigure( new FileInputStream( configFile ), configFile.toString() );

---> doConfigure(InputStream, String )
用 XML帮助类 解释传入来的流,解释成org.dom4j.Document的形式,
跳转到doConfigure( doc )

---->doConfigure(org.dom4j.Document doc):
      读取Hibernate的信息:(分成session-factory和security两部分来处理)
(1) session-factory:
将session-factory的名字存入Environment.SESSION_FACTORY_NAME,
调用addProperties( sfNode ),parseSessionFactory( sfNode, name ),
     将Hibernate.xml.hbm的< session-factory >里的<property>标签和其他标签的内容存入。
  (2)security:
        将Hibernate.xml.hbm的< security >里标签的内容存入。
Configuration类 之 SchemaExport
SchemaExport export=new SchemaExport(cfg);
   export.create(true, true);
   SchemaExport类是一个将表结构导入数据库的工具。


public SchemaExport(Configuration cfg) throws HibernateException {
this( cfg, cfg.getProperties() );
}
--->
public SchemaExport(Configuration cfg, Settings settings) throws HibernateException
从配置中得到方言dialect,根据方言得到相应生成表的SQL,和删除表的SQL。
  创建一个应用程序到数据库的连接帮助类。
---> export.create(true, true);
  直接跳转到 execute( true, true, false, false )
----> execute(boolean, boolean, boolean, boolean )
根据导入的SQL(import.sql)进行处理。
分享到:
评论
1 楼 wang1352083 2013-03-23  
cfg.addClass(User.class);
cfg.configure();
这两句的顺序对执行结果是否有影响?

相关推荐

    hibernate源码分析一_启动过程_

    在深入探讨Hibernate启动过程之前,首先需要了解Hibernate是什么。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发人员提供了一种在Java应用程序中操作数据库的方式,使得数据库操作可以更加面向对象化...

    hibernate源码分析一[启动过程]

    在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类扮演着系统环境变量的关键角色,它定义...

    Hibernate3.3.2GA启动过程分析

    《Hibernate 3.3.2 GA 启动过程深度解析》 Hibernate,作为一款流行的Java持久化框架,其启动过程的复杂性和精妙之处一直是开发者深入理解的重点。本文基于Hibernate 3.3.2 GA版本,对启动流程进行了详细的剖析,...

    hibernate源码分析

    **二、Hibernate源码启动过程** Hibernate的启动涉及配置文件解析、SessionFactory的创建、实体类扫描等多个环节。首先,通过Configuration类读取hibernate.cfg.xml,解析配置信息,然后建立SessionFactory。...

    Hibernate源码解析(一)

    总结来说,Hibernate源码解析是一个深入理解Java ORM机制、数据库操作以及软件设计模式的过程。通过学习,开发者不仅能提升技能,也能更好地应对实际开发中的挑战。对于想要成为高级Java开发者或架构师的人来说,这...

    启动tomcat报错org.hibernate.cache.CacheProvider

    在描述中提到的博客链接没有具体内容,但从链接格式可以推测,这是一个技术博客,可能详细记录了解决这个问题的过程或者给出了错误分析。通常,当遇到此类错误,开发者会查看日志信息,寻找关于异常的具体描述,比如...

    hibernate介绍

    通过以上介绍,我们可以看到 Hibernate 不仅简化了 Java 应用程序与数据库交互的过程,还提供了一系列强大的工具和特性来支持高级数据库操作,如事务管理、缓存策略、批量处理等,大大提高了开发效率。在实际应用中...

    hibernate源码

    2. **配置文件**:Hibernate的配置文件(通常为`hibernate.cfg.xml`)包含了数据库连接信息、映射文件的位置、会话工厂设置等,它是启动Hibernate的前提。 3. **实体类和映射文件**:每个Java实体类都对应一个...

    hibernate常見錯誤

    在启动Hibernate时遇到此类错误通常是因为类路径(Classpath)中缺失必要的jar包。具体到这个例子中,问题在于未找到`ehcache.jar`文件。 **解决方案:** 1. **检查类路径:**确保`ehcache.jar`存在于项目的类路径...

    Hibernate配置

    本文将深入探讨Hibernate的配置过程,包括基本设置、数据源配置、映射文件配置以及SessionFactory的创建。 **1. Hibernate基本配置** 在使用Hibernate之前,首先需要在项目的`hibernate.cfg.xml`配置文件中进行...

    hibernate+spring复习大纲

    **hibernate+spring复习大纲** ...复习过程中,可以通过选择题、填空题以及案例分析来巩固理论知识,加深对这两个框架的理解。确保能够熟练地将它们应用于实际项目开发中,提升开发效率和代码质量。

    Hibernate开发指南___夏昕

    “Hibernate配置”章节解释了如何设置Hibernate的配置文件,这是启动和使用Hibernate的关键步骤。正确的配置可以确保框架与特定数据库的兼容性,并优化性能。“第一段代码”部分则鼓励读者动手实践,通过编写简单的...

    hibernate_search.pdf

    - **使用Maven**:指导如何通过Maven管理Hibernate Search依赖,简化项目构建过程。 - **配置**:涵盖Hibernate Search的基本配置,包括如何在应用程序中启用搜索功能。 - **索引化**:介绍如何创建、更新或删除索引...

    hibernate,hibernate实例源码

    源码分析是深入理解Hibernate工作原理的关键。通过阅读和理解以下关键组件的源码: 1. Configuration:配置加载和解析的过程。 2. SessionFactory:如何根据配置信息创建SessionFactory,以及其内部的缓存机制。 3....

    springMVC+hibernate搭建的一个demo帮助新人

    通过分析和学习这个项目,新手可以更好地理解这两个框架的整合过程,以及如何在实际开发中使用它们。文件列表中的"SpringMVC1"可能包含项目的主配置文件、实体类、DAO、Service、Controller等相关代码,详细内容需要...

    Eclipse 3.7(Indigo)hibernate Tools

    - 提供了性能分析工具,可以帮助开发者优化Hibernate应用,识别潜在的性能瓶颈,例如N+1查询问题。 8. **版本兼容性**: - Hibernate Tools在Eclipse 3.7 Indigo版本中的适配意味着它支持Hibernate 3.x和4.x系列...

    hibernate_src.zip

    1. SessionFactory:它是所有Session的工厂,负责初始化数据库连接、事务策略、缓存等配置,是线程安全的,一般在应用启动时创建并全局共享。 2. Session:是与数据库交互的主要接口,每个数据库操作都在一个...

    hibernate-orm-3.3源码

    总结,通过分析《hibernate-orm-3.3源码》,我们可以深入理解 Hibernate 的工作机制,掌握如何高效地使用 ORM 技术,以及如何根据需求扩展和定制 Hibernate。对于任何想提升数据库操作效率和代码可维护性的 Java ...

Global site tag (gtag.js) - Google Analytics