`

Hibernate源码解析---------hibernate.cfg.xml读取流程

阅读更多
通常我们使用Hibernate的时候 ,首先要通过以下的代码去创建一个Session.

 Configuration con=new Configuration().configure();
 ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(con.getProperties()).buildServiceRegistry();
    	 
    	 SessionFactory factory=con.buildSessionFactory(sr);
    	 
    	 Session session=factory.openSession();
    	
    	 Transaction ts=session.beginTransaction();





这里先从我们创建sessionfactory的代码入手, 一级级往里看。

Configuration con=new Configuration().configure();

Configuration位于包org.hibernate.cfg下。该类是读取hibernate.cfg.xml文件的入口。
进入该类, 我们看到 1965行,
	public Configuration configure() throws HibernateException {
		configure( "/hibernate.cfg.xml" );
		return this;
	}

也就是说,在没有放入参数的情况下, hibernate默认会找到名字为hibernate.cfg.xml文件来进行解析。
继续往下看, 找到带参数的configure()。

public Configuration configure(String resource) throws HibernateException {
		LOG.configuringFromResource( resource );
		InputStream stream = getConfigurationInputStream( resource );
		return doConfigure( stream, resource );
	}


不看LOG, 这里有两个方法被执行。
1. InputStream stream = getConfigurationInputStream(resource);
2003行:
protected InputStream getConfigurationInputStream(String resource) throws HibernateException {
		LOG.configurationResource( resource );
		return ConfigHelper.getResourceAsStream( resource );
	}

继续看ConfigHelper.getResourceAsStream(resource);
ConfigHelper位于org.hibernate.internal.util。
	public static InputStream getResourceAsStream(String resource) {
		String stripped = resource.startsWith("/") ?
				resource.substring(1) : resource;

		InputStream stream = null;
		ClassLoader classLoader = ClassLoaderHelper.getContextClassLoader();
		if (classLoader!=null) {
			stream = classLoader.getResourceAsStream( stripped );
		}
		if ( stream == null ) {
			stream = Environment.class.getResourceAsStream( resource );
		}
		if ( stream == null ) {
			stream = Environment.class.getClassLoader().getResourceAsStream( stripped );
		}
		if ( stream == null ) {
			throw new HibernateException( resource + " not found" );
		}
		return stream;
	}


这里也就获取了该xml文件的stream。支线1到此结束。

2.  doConfigure( stream, resource );
Configuration的2064行

protected Configuration doConfiguration(InputStream stream, String resourcesName) throws HibernateException {
   try{
     Document document=xmlHelper.createSAXReader(errorLogger, entityResolver).read(new InputStream(stream));
/*关于这个xmlHelper是在哪里被创建的, 我花了点时间才看出来原来是构造函数里面被创建的。 Configuration有两个构造函数字:protected Configuration(SettingsFactory settingsFactory) {
		this.settingsFactory = settingsFactory;
		reset();
	}

	public Configuration() {
		this( new SettingsFactory() );
	}
第二个会在创建Configuration对象的时候调用第一个构造函数, 而第一个函数里面的reset()会创建所有内部的属性对象。 也就是每次创建Configuration,这些都会重置, 所以叫reset。这里学习了。
*/
  doConfigure(document);
  finally{
   stream.close();

}
  return this;

}
}

}


这里看一下doConfugration(Document doc)的代码: (2112行)
protected Configuration doConfigure(Document doc) throws HibernateException {
Element sfNode = doc.getRootElement().element("session-factory");
String name=sfNode.attributeValue("name");
if(name!=null){
  properties.setProperty(Environment.SESSION_FACTORY_NAME, name);
}
addProperties(sfNode);
parseSessionFactory(sfNode, name);
Element secNode=doc.getRootElement().element("security");
if(secNode!=null){
parseSecurity(secNode);
}

return this;
}


}
终于看到我们熟悉的东西了。。T_T 
在此, Element sfNode得到了xml文件里面的<session-factory>节点内容, 并在之后的方法被加入对象 --addProperties(sfNode);

public Configuration addProperties(Properties extraProperties) {
		this.properties.putAll( extraProperties );
		return this;
	}

properties是Configuration类的内部对象。
于是session-factory节点就这么被加进去了。

这个properties是个很重要的变量, 在后面的ServiceRegistry创建的时候就会被用到。

--
可以看到这里的返回参数几乎都是Configuration, 弄来弄去, 最后都是在修改这个Configuration类的实例对象。
还是最初那行代码
Configuration con=new Configuration().configure(); 
说白了, 这里的configure()就是调用了一大堆内部外部方法, 将new出来的Configuration实例进行了加工, 然后返回。。


今天先到这儿, 明天继续研究, 争取早点把这个图画出来, 写的太乱了实在是。
分享到:
评论

相关推荐

    hibernate-core-5.0.11.Final.jar

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

    hibernate-release-4.3.10.Final.zip

    - **Configuration**:负责配置Hibernate,加载hibernate.cfg.xml文件,建立SessionFactory。 - **SessionFactory**:是线程安全的,用于创建Session实例,它是整个Hibernate的核心,管理实体类和数据库表的映射...

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

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

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

    本文将深入探讨如何使用DOM4J库来生成和读取`hibernate.cfg.xml`,这是一个强大的Java XML处理库。 首先,让我们了解DOM4J的基本概念。DOM4J是一个开源的Java库,它提供了一套灵活的API来处理XML文档,包括读取、...

    hibernate-release-4.3.9.Final.rar

    - 配置Hibernate:创建hibernate.cfg.xml文件,定义数据库连接、方言、缓存策略等。 - 映射对象:通过XML映射文件或注解将Java类映射到数据库表。 - 创建SessionFactory:通过Configuration实例化SessionFactory...

    hibernate-release-5.2.16.Final源码包

    在Hibernate中,dom4j主要用于读取和解析Hibernate的配置文件,如`hibernate.cfg.xml`,从而动态构建SessionFactory,极大地简化了配置过程。 三、c3p0在Hibernate中的配置与使用 要将c3p0作为Hibernate的连接池,...

    hibernate-release-4.3.0.Beta2 lib

    配置 Hibernate,首先需要在配置文件(通常是 `hibernate.cfg.xml`)中指定数据库连接信息,然后创建 SessionFactory,通过 Session 进行数据操作。在实体类上使用注解进行映射,使用 HQL 或 JPQL 进行查询。 5. *...

    hibernate-release-5.2.11.Final.zip

    2. **配置文件(hibernate.cfg.xml)**:在项目中,我们需要配置一个`hibernate.cfg.xml`文件,用于设置数据库连接信息、方言、缓存策略等,这是启动Hibernate的第一步。 3. **实体类(Entity)**:实体类代表...

    hibernate-release-5.0.6.Final

    1. Configuration:配置对象用于读取hibernate.cfg.xml配置文件,初始化SessionFactory。 2. SessionFactory:是线程安全的,负责创建Session实例,它是数据库会话工厂。 3. Session:代表一次数据库会话,负责执行...

    hibernate-release-5.0.6.Final.zip(最新Hibernate架包)

    4. **配置Hibernate**:使用Hibernate,首先需要创建一个配置文件(通常是hibernate.cfg.xml),在这个文件中定义数据库连接信息、实体类的映射文件位置、事务管理器等。此外,每个需要持久化的Java类也需要相应的...

    hibernate-release-4.2.4核心jar包

    在Hibernate中,dom4j被用来解析Hibernate的配置文件,如.hibernate.cfg.xml,以及映射文件,如.hbm.xml,以获取元数据信息。 `hibernate-jpa-2.0-api-1.0.1.Final.jar`包含Java Persistence API(JPA)的规范,这...

    hibernate-distribution-3.6.0.Final-dist

    2. **配置Hibernate**:创建`hibernate.cfg.xml`配置文件,指定数据库连接参数、方言、缓存等。 3. **定义实体**:使用Java类表示数据库表,并用注解或XML描述映射关系。 4. **创建SessionFactory**:基于配置文件...

    hibernate-orm-4.2.20.Final.zip源码

    1. Configuration:配置对象,负责读取Hibernate配置文件(hibernate.cfg.xml),设置数据库连接参数,加载实体类映射文件(hbm.xml)等。 2. SessionFactory:会话工厂,是线程安全的,用于创建Session实例,它是...

    hibernate-3.3.2.GA-jar包集合

    2. **配置文件(hibernate.cfg.xml)**: - Hibernate配置文件包含了数据库连接信息,如JDBC驱动、URL、用户名和密码,以及方言(Dialect)等,用于初始化SessionFactory。 3. **实体类(Entities)**: - 实体类...

    hibernate-release-4.2.19.Final

    - **hibernate.cfg.xml**:这是Hibernate的核心配置文件,用于定义数据源、实体扫描路径、缓存策略等关键参数。 - **实体类注解**:使用@Entity、@Table等注解,定义Java类与数据库表的映射关系;@Id、@...

    Hibernate源码解析(一)

    - Configuration:配置对象,负责读取hibernate.cfg.xml配置文件,初始化SessionFactory。 - SessionFactory:会话工厂,是线程安全的,用于创建Session对象。它是整个Hibernate的核心,缓存了所有实体类的元数据...

    hibernate-release-5.0.11.Final

    3. Configuration:配置文件(hibernate.cfg.xml)定义了数据库连接信息、实体类映射等,是Hibernate初始化的重要部分。 4. Mapping文件:每个Java实体类对应一个.hbm.xml文件,描述了类与表之间的映射关系,包括...

    hibernate-distribution-3.5.6-Final.rar

    在实际开发中,我们需要结合"hibernate-distribution-3.5.6-Final"中的配置文件(如hibernate.cfg.xml)来设置数据库连接信息,并在实体类中定义与数据库表对应的字段。通过SessionFactory的实例,我们可以创建...

    hibernate-distribution-3.6.10.Final基本包

    1. 加载配置:使用Configuration读取hibernate.cfg.xml配置信息,构建SessionFactory。 2. 创建Session:SessionFactory创建Session实例,用于数据库交互。 3. 开启事务:在Session中开始一个数据库事务。 4. CRUD...

    hibernate-release-5.3.5.Final

    1. 映射机制:Hibernate通过XML文件(如hibernate.cfg.xml)定义对象和表之间的映射关系,实现对象与数据库的无缝转换。 2. Session管理:Session是Hibernate的主要工作接口,负责对象的持久化操作,包括保存、更新...

Global site tag (gtag.js) - Google Analytics