最近简略看了一下hibernate的源代码,比较晕,不过也看出了大概,
我看源代码喜欢模仿着写,这样有助理解,写的比较简陋,估计一段时间也不会再更新了,
先贴这,
把总结写出来,边看边写吧,先写初始化部分。
Configuration cfg = new Configuration();
SessionFactory factory = cfg.buildSessionFactory();
Session s = factory.openSession();
Transaction tx = s.beginTransaction();
上边是hibernate 自带例子里边的调用顺序,
就采用流水账写法,跟着这几句代码,一个方法一个方法的走。
Configuration cfg = new Configuration();
protected Configuration(SettingsFactory settingsFactory) {
this.settingsFactory = settingsFactory;
reset();
}
public Configuration() {
this( new SettingsFactory() );
}
显示new Configuration 类, 从上边实现可以看出,要先new 一个 SettingsFactory
那就先看SettingsFactory
public class SettingsFactory implements Serializable {
public static final String DEF_CACHE_REG_FACTORY = NoCachingRegionFactory.class.getName();
private static final Logger log = LoggerFactory.getLogger(SettingsFactory.class);
protected SettingsFactory() {
}
public Settings buildSettings(Properties props) {
Settings settings = new Settings();
构造函数为空,那就回头接着看Configuration
reset() 方法,
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();
}
properties = Environment.getProperties();
看下他的实现
Environment.java
public static Properties getProperties() {
Properties copy = new Properties();
copy.putAll(GLOBAL_PROPERTIES);
return copy;
}
函数返回的,实际就是 GLOBAL_PROPERTIES,
那么他是在哪里被初始化的呢?
原来这个类里边有个静态代码块
static {
log.info("Hibernate " + VERSION);
RENAMED_PROPERTIES.put( "hibernate.cglib.use_reflection_optimizer", USE_REFLECTION_OPTIMIZER );
ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_NONE), "NONE" );
ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_READ_UNCOMMITTED), "READ_UNCOMMITTED" );
ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_READ_COMMITTED), "READ_COMMITTED" );
ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_REPEATABLE_READ), "REPEATABLE_READ" );
ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_SERIALIZABLE), "SERIALIZABLE" );
GLOBAL_PROPERTIES = new Properties();
//Set USE_REFLECTION_OPTIMIZER to false to fix HHH-227
GLOBAL_PROPERTIES.setProperty( USE_REFLECTION_OPTIMIZER, Boolean.FALSE.toString() );
try {
InputStream stream = ConfigHelper.getResourceAsStream("/hibernate.properties");
try {
GLOBAL_PROPERTIES.load(stream);
log.info( "loaded properties from resource hibernate.properties: " + PropertiesHelper.maskOut(GLOBAL_PROPERTIES, PASS) );
}
catch (Exception e) {
log.error("problem loading properties from hibernate.properties");
}
finally {
try{
stream.close();
}
catch (IOException ioe){
log.error("could not close stream on hibernate.properties", ioe);
}
}
}
catch (HibernateException he) {
log.info("hibernate.properties not found");
}
try {
GLOBAL_PROPERTIES.putAll( System.getProperties() );
}
catch (SecurityException se) {
log.warn("could not copy system properties, system properties will be ignored");
}
verifyProperties(GLOBAL_PROPERTIES);
ENABLE_BINARY_STREAMS = PropertiesHelper.getBoolean(USE_STREAMS_FOR_BINARY, GLOBAL_PROPERTIES);
ENABLE_REFLECTION_OPTIMIZER = PropertiesHelper.getBoolean(USE_REFLECTION_OPTIMIZER, GLOBAL_PROPERTIES);
if (ENABLE_BINARY_STREAMS) {
log.info("using java.io streams to persist binary types");
}
if (ENABLE_REFLECTION_OPTIMIZER) {
log.info("using bytecode reflection optimizer");
}
BYTECODE_PROVIDER_INSTANCE = buildBytecodeProvider( GLOBAL_PROPERTIES );
boolean getGeneratedKeysSupport;
try {
Statement.class.getMethod("getGeneratedKeys", null);
getGeneratedKeysSupport = true;
}
catch (NoSuchMethodException nsme) {
getGeneratedKeysSupport = false;
}
JVM_SUPPORTS_GET_GENERATED_KEYS = getGeneratedKeysSupport;
if (!JVM_SUPPORTS_GET_GENERATED_KEYS) log.info("JVM does not support Statement.getGeneratedKeys()");
boolean linkedHashSupport;
try {
Class.forName("java.util.LinkedHashSet");
linkedHashSupport = true;
}
catch (ClassNotFoundException cnfe) {
linkedHashSupport = false;
}
JVM_SUPPORTS_LINKED_HASH_COLLECTIONS = linkedHashSupport;
if (!JVM_SUPPORTS_LINKED_HASH_COLLECTIONS) log.info("JVM does not support LinkedHasMap, LinkedHashSet - ordered maps and sets disabled");
JVM_HAS_TIMESTAMP_BUG = new Timestamp(123456789).getTime() != 123456789;
if (JVM_HAS_TIMESTAMP_BUG) log.info("using workaround for JVM bug in java.sql.Timestamp");
Timestamp t = new Timestamp(0);
t.setNanos(5 * 1000000);
JVM_HAS_JDK14_TIMESTAMP = t.getTime() == 5;
if (JVM_HAS_JDK14_TIMESTAMP) {
log.info("using JDK 1.4 java.sql.Timestamp handling");
}
else {
log.info("using pre JDK 1.4 java.sql.Timestamp handling");
}
}
GLOBAL_PROPERTIES 的初始化就在这里,主要是这几句,
GLOBAL_PROPERTIES = new Properties();
GLOBAL_PROPERTIES = new Properties();
InputStream stream = ConfigHelper.getResourceAsStream("/hibernate.properties");
try {
GLOBAL_PROPERTIES.load(stream);
("/hibernate.properties") 就是默认的配置文件了,
至于 static 块里的其他代码,就暂时不看了。
到了这里,hibernate的配置文件,就加载到hibernate框架里了。
分享到:
相关推荐
《深入剖析Hibernate 3.2源代码》 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。在Hibernate 3.2版本中,开发者们能够更深入地理解其内部机制,从而提高开发效率...
<hibernate-configuration> <!--com/sfhn/cim_dbms/hbm/IEC61968_Assets_AssetBasics_Asset.hbm.xml map-to EAA_Asset -->
源代码中的`Configuration`类负责读取这些配置,构建`SessionFactory`,这是执行所有Hibernate操作的基础。 3. **实体管理** 在3.2.5版本中,`Entity`是核心概念,代表数据库表。`HibernateAnnotations`和XML映射...
Hibernate 源代码分析 (一):设计属于我的 SessionFactory 和 ConnectionProvider 在这篇文章中,我们将探讨 Hibernate 框架的源代码,了解 SessionFactory 和 ConnectionProvider 的实现机制。首先,我们需要了解 ...
1. **EntityScanner**: Hibernate源码中负责扫描项目中所有标注了@Entity的类,构建实体类的元数据。 2. **SessionFactoryBuilder**: 创建SessionFactory的过程,包括配置读取、数据库连接建立、方言选择等。 3. *...
**Hibernate入门源代码详解** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个资源包包含了“chapter07”目录下的源代码,是学习Hibernate基础知识的理想起点。让...
Hibernate源代码分析 在 Hibernate 框架中,SessionFactory 和 ConnectionProvider 是两个非常重要的组件,了解它们的实现机制对于深入了解 Hibernate 的工作原理具有重要意义。本文将通过分析 Hibernate 的源代码...
通过深入研究这个 Hibernate 3.x 的源代码,你可以了解到其内部的工作流程,比如对象状态管理、查询解析、SQL 生成等,这将有助于提升你的编程技巧和解决问题的能力。同时,熟悉 Hibernate 的最佳实践,可以帮助你在...
《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...
《Hibernate开发实战讲解》源码解析 在Java领域,Hibernate是一个非常重要的持久化框架,它极大地简化了数据库操作,使得开发者能够专注于业务逻辑而非繁琐的数据交互。本篇将深入探讨Hibernate的核心概念,以及...
通过阅读和分析Hibernate 3.2的源码,我们可以深入了解ORM框架的设计理念,学习如何优化数据库操作,以及如何在实际项目中灵活运用Hibernate提供的各种功能。同时,这也有助于我们掌握Java反射、代理、元数据解析等...
《深入剖析Hibernate源码》 Hibernate,作为Java领域中的一款著名持久化框架,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑而非繁琐的数据交互。本文将基于“hibernate源代码的zip文件”展开,深入...
通过阅读和分析Hibernate的源代码,开发者能够深入理解其内部机制,包括持久化策略、查询语言(HQL)、缓存管理以及事务处理等核心功能。 一、Hibernate ORM框架介绍 Hibernate 提供了一个强大的接口,用于在Java...
这里我们将围绕“hibernate3.2.4 源代码”这一主题,探讨Hibernate的核心概念、设计模式以及关键组件。 1. **核心概念**: - **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它允许开发者用面向对象的方式...
在这个“hibernate源代码”压缩包中,包含的是Hibernate框架的核心源码,这为我们深入理解其工作原理、自定义功能或者优化性能提供了可能。 在Hibernate源代码中,有几个关键的模块和类值得我们关注: 1. **...
源码中的`org.hibernate.cfg`包包含了配置和映射的相关类,如`Configuration`和`AnnotationBinder`。 2. **Session接口**:`org.hibernate.Session`是与数据库进行交互的主要接口,提供了持久化对象、查询数据、...
在这个`hibernate-release-4.1.4.Final`版本中,包含了完整的Hibernate源码以及所有必要的jar包,使得我们可以深入理解其工作原理并进行定制开发。 首先,让我们探讨一下Hibernate的核心概念。Hibernate的核心是...
标题:hibernate源码分析一[启动过程] 在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类...
10. 设计模式应用:Hibernate源代码中广泛应用了工厂模式、单例模式、代理模式等经典设计模式,研究源码可以加深对这些模式的理解。 总之,深入研究Hibernate源代码是提升Java开发技能的重要步骤,可以帮助我们更好...
3. 学习与调试Hibernate源码: - 查阅源码:通过Eclipse的代码导航功能,可以快速定位到具体类和方法,理解其实现逻辑。 - 创建测试用例:为了更好地理解Hibernate的功能,可以创建一些测试用例,模拟数据库操作,...