`
r.zeus
  • 浏览: 14621 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate3 : org.hibernate.cfg.Configuration解析

阅读更多

Hibernate3 : org.hibernate.cfg.Configuration 解析

<!----> <o:p> </o:p>

  第一次写文章,不好的地方,请口下留情哈。

  org.hibernate.cfg.Configurations 根据 xml 文件配置整个工作过程中所需要的参数。一般

我们会用 Configuration cfg = new Configuration().configure(); 创建一个配置类。那么,这句话到底做了什么呢?

  首先, new Configuration() 会做些什么呢?我们来看他的源码:

  

  protected Configuration(SettingsFactory settingsFactory) {<o:p></o:p>

        System.out.println("Configuration(SettingsFactory settingsFactory)");<o:p></o:p>

        this.settingsFactory = settingsFactory;<o:p></o:p>

        reset();<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

// 默认构造函数,先 new SettingsFactory() 然后调用

//protected Configuration(SettingsFactory settingsFactory)

    <o:p> </o:p>

public Configuration() {<o:p></o:p>

        this(new SettingsFactory());<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

reset() 初始化了很多变量,感兴趣的可以去看源代码,没有什么特别的地方。

 

  接着,调用 configure() 方法!

public Configuration configure() throws HibernateException {<o:p></o:p>

        configure("/hibernate.cfg.xml");<o:p></o:p>

        return this;<o:p></o:p>

}<o:p></o:p>

可以看出,默认使用 hibernate.cfg.xml 文件,如果想用自定义的文件,可以调用

configure(“….xml”) 方法。

public Configuration configure(String resource) throws HibernateException {<o:p></o:p>

        log.debug("configuring from resource: " + resource);<o:p></o:p>

        InputStream stream = getConfigurationInputStream(resource);<o:p></o:p>

        return doConfigure(stream, resource);<o:p></o:p>

}<o:p></o:p>

根据 getConfigurationInputStream(resource) 得到文件流, getConfigurationInputStream(resource) 调用 ConfigHelper.getResourceAsStream(resource) <o:p> </o:p>

public static InputStream getResourceAsStream(String resource) {<o:p></o:p>

              String stripped = resource.startsWith("/") ? <o:p></o:p>

                            resource.substring(1) : resource;<o:p></o:p>

              InputStream stream = null; <o:p></o:p>

              ClassLoader classLoader = Thread.currentThread().getContextClassLoader();<o:p></o:p>

              if (classLoader!=null) {<o:p></o:p>

                     stream = classLoader.getResourceAsStream( stripped );<o:p></o:p>

              }

// 这里的代码可能应该是 stream = Environment.class.getResourceAsStream( resource );<o:p></o:p>

              if ( stream == null ) {<o:p></o:p>

                     Environment.class.getResourceAsStream( resource );<o:p></o:p>

              }<o:p></o:p>

<o:p> </o:p>

              if ( stream == null ) {<o:p></o:p>

                     stream = Environment.class.getClassLoader().getResourceAsStream( stripped );<o:p></o:p>

              }<o:p></o:p>

              if ( stream == null ) {<o:p></o:p>

                     throw new HibernateException( resource + " not found" );<o:p></o:p>

              }<o:p></o:p>

              return stream;<o:p></o:p>

       }<o:p></o:p>

然后 doConfigure(stream, resource) <o:p> </o:p>

protected Configuration doConfigure(InputStream stream, String resourceName) throws HibernateException {<o:p></o:p>

org.dom4j.Document doc;<o:p></o:p>

        try {<o:p></o:p>

            List errors = new ArrayList();<o:p></o:p>

            SAXReader saxReader = xmlHelper.createSAXReader(resourceName, errors, entityResolver);<o:p></o:p>

            doc = saxReader.read(new InputSource(stream));<o:p></o:p>

            if (errors.size() != 0) {<o:p></o:p>

                throw new MappingException(<o:p></o:p>

                        "invalid configuration",<o:p></o:p>

                        (Throwable) errors.get(0)<o:p></o:p>

                );<o:p></o:p>

            }<o:p></o:p>

        }<o:p></o:p>

entityResolver 在初始值为 entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER ; reset() 的时候设置的。 XMLHelper.DEFAULT_DTD_RESOLVE XMLHelper 默认是 XMLHelper.DEFAULT_DTD_RESOLVER= new DTDEntityResolver() DTDEntityResolver 是用来加载 dtd 文件的。别跟我说你不知道 dtd 是什么东西?它有 3 种加载方式:

1.  文件路径以 http://hibernate.sourceforge.net/ 开头的文件,如

http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd

它会把 http://hibernate.sourceforge.net 去掉,加上 org/hibernate/ ,文件路径为

org/hibernate/hibernate-configuration-3.0.dtd ,然后加载这个文件。

2.       文件路径以 file:// 开头的文件,如

  file://hibernate-configuration-3.0.dtd

它会把 file:// 去掉,路径为 hibernate-configuration-3.0.dtd ,然后加载这个文件。

3. 如果没有以上 2 种情况,则直接加载。就是路径名没有修改过。

整个过程在 public InputSource resolveEntity(String publicId, String systemId) 中实现。

systemId 就是 dtd 的路径。大家可以去看看 SAXReader 类自带的

protected static class SAXEntityResolver ,比较比较。

 

<o:p> </o:p>

在得到 doc 的值

            doc = saxReader.read(new InputSource(stream));<o:p></o:p>

后,调用 protected Configuration doConfigure(org.dom4j.Document doc) ,这个函数主要是根据 doc 的到配置参数,然后存到 properties 中。

  先是设置 session-factory 的名字:

<o:p> </o:p>

Element sfNode = doc.getRootElement().element("session-factory");<o:p></o:p>

        String name = sfNode.attributeValue("name");<o:p></o:p>

        if (name != null) {<o:p></o:p>

             // 保存到 properties 中! <o:p> </o:p>

            properties.setProperty(Environment.SESSION_FACTORY_NAME, name);<o:p></o:p>

        }<o:p></o:p>

<o:p> </o:p>

然后是 addProperties(sfNode) ,把 <property name=" "> </property> 保存到 properties 中。

// 这句话估计又是多余的 <o:p> </o:p>

properties.setProperty(name, value);<o:p></o:p>

<o:p> </o:p>

            if (!name.startsWith("hibernate")) {<o:p></o:p>

                properties.setProperty("hibernate." + name, value);<o:p></o:p>

            }

接着调用了 parseSessionFactory(sfNode, name) ,把 mapping class-cache collection-cache listener event 等配置保存。到底它保存到哪,我也不全知道,只看了

protected void parseMappingElement(Element subelement, String name), 根据配置加载了 mapping 的文件,最后使用 HbmBinder : public static void bindRoot(Document doc, Mappings mappings, java.util.Map inheritedMetas) 保存。 bindRoot 是对 mapping 中的 xml 文件进行解析。

HbmBinder Configuration 都有 2000 行以上的代码,在 Hibernate 中有很重要的地位。 Configuration 使用 .cfg.xml ,而 HbmBinder 则使用了 .hbm.xml

<o:p> </o:p>

              extractRootAttributes( hmNode, mappings ) 根据 <hibernate-mapping> 的配置,把分析的结果存入 mapping

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

 

分享到:
评论

相关推荐

    HIbernate4.3.6整合c3p0所需jar

    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843) at org.hibernate.cfg.Configuration...

    Hibernate的........htm.xml和hibernatecfg.xml配置

    1. `&lt;hibernate-configuration&gt;`:配置文件的根元素。 2. `&lt;session-factory&gt;`:定义SessionFactory,是Hibernate的核心组件。 3. `&lt;property&gt;`:设置各种配置参数,如: - `connection.driver_class`:JDBC驱动类...

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...

    hibernate.cfg.xml文件

    虽然`hibernate.cfg.xml`文件主要用于配置,但深入了解Hibernate源码,我们可以看到在加载配置文件后,Hibernate会解析XML,构建内部的数据结构,然后根据这些配置初始化各种组件,如连接池、方言等。 总结,`...

    hibernate配置文件hibernate.cfg.xml的详细解释

    通过上述详细解析可以看出,`hibernate.cfg.xml`配置文件对于Hibernate的初始化和运行有着至关重要的作用。合理配置这些属性不仅可以提升应用程序的性能,还可以简化开发和调试过程。因此,在实际应用中应根据具体...

    commons-beanutils-1.7.0

    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1263) at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1235) at org.hibernate.cfg.Configuration....

    Hibernate_3.6.6_CHM 文档

    org.hibernate.cfg This package defines APIs for configuring Hibernate, and classes for building the Hibernate configuration-time metamodel. org.hibernate.classic This package implements backward-...

    hibernate.cfg.xml文件详细解释

    ### hibernate.cfg.xml 文件详解 #### 一、概述 `hibernate.cfg.xml` 是 Hibernate 框架的核心配置文件之一,它主要用于配置 Hibernate 的运行环境。通过该文件,开发者可以指定数据库连接信息、日志级别、性能...

    hibernate3.6API

    org.hibernate.cfg This package defines APIs for configuring Hibernate, and classes for building the Hibernate configuration-time metamodel. org.hibernate.classic This package implements backward-...

    hibernate-core-5.0.11.Final.jar

    - `Configuration`类:负责读取和解析hibernate.cfg.xml配置文件,生成SessionFactory实例。 - `SessionFactoryImpl`:实际的SessionFactory实现,包含Session的创建逻辑和缓存管理。 - `SessionImpl`:Session的...

    Jdom生成hibernate.cfg.xml和读取其中内容

    标题中的“Jdom生成hibernate.cfg.xml和读取其中内容”涉及到两个主要知识点:一是JDOM库在Java中解析和生成XML文档的应用,二是利用JDOM操作Hibernate配置文件`hibernate.cfg.xml`。 首先,JDOM是Java Document ...

    基于IDEA的SSH项目之五:集成Hibernate--程序包

    接下来,我们需要在项目的src/main/resources目录下创建Hibernate的配置文件(例如:hibernate.cfg.xml)。此文件用于定义数据源、JDBC连接信息、Hibernate的属性以及映射文件的位置。配置文件应包含如下内容: ```...

    hibernate(api 介绍).pdf

    1. org.hibernate.cfg.Configuration Interface:配置并启动 Hibernate,指定 Hibernate 配置文件的位置或动态配置 Hibernate 的属性,接着创建 SessionFactory。 2. org.hibernate.SessionFactory Interface:从该...

    spring4集成hibernate3:xml方式

    &lt;property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/&gt; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; ``` ...

    hibernate-release-4.2.2.Final

    《Hibernate 4.2.2.Final:深度解析与应用》 Hibernate,作为一个开源的对象关系映射(ORM)框架,是Java开发中的重要工具,它极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。本文将深入探讨...

    6 用Properties补充hibernate.cfg.xml配置

    3. **注入到Configuration对象**:将加载的属性注入到Hibernate的`Configuration`对象中: ```java Configuration config = new Configuration().configure(); config.setProperty("hibernate.connection.url", ...

    hibernate(api 介绍).docx

    1. org.hibernate.cfg.Configuration Interface:配置并启动 Hibernate。通过该接口可以指定 Hibernate 配置文件(hibernate.cfg.xml 或者 hibernate.properties)的位置或动态配置 Hibernate 的属性,接着创建 ...

    使用dom4j生成和读取hibernate.cfg.xml

    然后,构建`Element`对象来表示`hibernate.cfg.xml`中的各个配置元素,如`hibernate-configuration`、`session-factory`等,并添加属性和子元素。以下是一个简单的示例: ```java import org.dom4j.Document; ...

    Hibernate开发指南.pdf

    3. **配置Hibernate**: 创建`hibernate.cfg.xml`文件来配置数据库连接信息以及其他配置参数。 #### 四、由数据库产生基础代码 通过Hibernate的工具,可以直接从现有的数据库表生成对应的实体类和映射文件,极大地...

Global site tag (gtag.js) - Google Analytics