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

Hibernate源码分析杂记

阅读更多

最近在看hibernate在load entity过程中的操作, 包括为实体类做增强,自动flush,一级缓存,在这里记录一下,慢慢会继续更新。

 

DefaultLoadEventListener:

final PersistenceContext persistenceContext = event.getSession().getPersistenceContext();

StatefulPersistenceContext.proxiesByKey 缓存实体

 

DefaultLoadEventListener:

private Object createProxyIfNecessary(
Object proxy = persister.createProxy( event.getEntityId(), event.getSession() );
		persistenceContext.getBatchFetchQueue().addBatchLoadableEntityKey( keyToLoad );
		persistenceContext.addProxy( keyToLoad, proxy );

 

 

EventListenerRegistryImpl 注册所有listener, 

private Map<EventType,EventListenerGroupImpl> registeredEventListenersMap = prepareListenerMap();

 

prepareListenerMap初始化需要的listener,调用prepareListeners完成实际动作。

prepareListeners(
				PRE_COLLECTION_UPDATE,
				workMap
		);

 

 

EventType与lisnter接口类对应,保存了event对应的实际处理的lisnter类。 

private EventType(String eventName, Class<? extends T> baseListenerInterface) {
		this.eventName = eventName;
		this.baseListenerInterface = baseListenerInterface;
	}

 

 

本身用static方式初始化了eventype对应的listener。

public static final EventType<MergeEventListener> MERGE
			= new EventType<MergeEventListener>( "merge", MergeEventListener.class );

 

 

Listener处理实际的event,以DefaultAutoFlushEventListener为例,该listener接收到AutoFlushEvent, 会查找该event内关联的session(用session接口的子接口EventSource),session的实现类是SessionImpl,其声明如下

public final class SessionImpl extends AbstractSessionImpl implements EventSource

 

DefaultAutoFlushEventListener的方法onAutoFlush(AutoFlushEvent event) 对event的处理如下:

final int oldSize = source.getActionQueue().numberOfCollectionRemovals();
			flushEverythingToExecutions(event);
			if ( flushIsReallyNeeded(event, source) ) {
				LOG.trace( "Need to execute flush" );

				performExecutions(source);
				postFlush(source);
				// note: performExecutions() clears all collectionXxxxtion
				// collections (the collection actions) in the session

				if ( source.getFactory().getStatistics().isStatisticsEnabled() ) {
					source.getFactory().getStatisticsImplementor().flush();
				}
			}

 

 

performExecutions中有如下调用,可以看到其根据session中保存的actionQueue进行处理,对action顺序进行重排:

session.getActionQueue().prepareActions();

session.getActionQueue().executeActions();

 

prepareAction调用保存的action的beforeExecutions方法,对action进行预处理

public void prepareActions() throws HibernateException {
		prepareActions( collectionRemovals );
		prepareActions( collectionUpdates );
		prepareActions( collectionCreations );
		prepareActions( collectionQueuedOps );
	}

 

executeActions则按顺序执行保存的action,实际调用的是action的execute方法:

	public void executeActions() throws HibernateException {
		if ( ! unresolvedInsertions.isEmpty() ) {
			throw new IllegalStateException(
					"About to execute actions, but there are unresolved entity insert actions."
			);
		}
		executeActions( insertions );
		executeActions( updates );
		// do before actions are handled in the other collection queues
		executeActions( collectionQueuedOps );
		executeActions( collectionRemovals );
		executeActions( collectionUpdates );
		executeActions( collectionCreations );
		executeActions( deletions );
	}

 

 

各种CRUD的action都实现了Executable的接口,该接口主要定义了execute()和beforeExecutions()方法,用于执行action前的一些处理操作和之后的实际操作。

action的一些继承层次如下:

public final class EntityInsertAction extends AbstractEntityInsertAction

public abstract class AbstractEntityInsertAction extends EntityAction

public abstract class EntityAction

implements Executable, Serializable, Comparable, AfterTransactionCompletionProcess

 

 

performExecutions(EventSource session) 中有这么一句:

session.getTransactionCoordinator().getJdbcCoordinator().flushEnding();

 

实现类是TransactionCoordinatorImpl, 其构造函数中:

this.jdbcCoordinator = new JdbcCoordinatorImpl( userSuppliedConnection, this );
this.transactionEnvironment = transactionContext.getTransactionEnvironment();

 

 

flushEnding中涉及到一个flushDepth,主要处理可能产生多个begin调用,每个begin调用都会让这个depth数量+1, 保证最后的end处理同样数量的flush.

	public void flushEnding() {
		flushDepth--;
		if ( flushDepth < 0 ) {
			throw new HibernateException( "Mismatched flush handling" );
		}
		if ( flushDepth == 0 ) {
			releasesEnabled = true;
		}
		
		afterStatementExecution();
	}

 

 

一个查询的处理流程:

Servlet.processRequest->JdbcTransaction.beforeTransactionCommit->SessionImpl.managedFlush->SessinImpl.flush->DefaultFlushEventListener.onFlush

->AbstractFlushingEventListener.performExecutior->JdbcCoordinatorImpl.flushEnding

0
3
分享到:
评论

相关推荐

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

    标题:hibernate源码分析一[启动过程] 在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类...

    Hibernate源码解析(一)

    - 错误排查:当遇到问题时,源码分析能更准确地定位问题所在,提高解决问题的效率。 - 自定义扩展:熟悉源码后,我们可以根据需求自定义拦截器、事件监听器等,实现特定功能。 总结来说,Hibernate源码解析是一个...

    hibernate源码分析过程

    Hibernate 源码分析过程 Hibernate 是一个基于 Java 的 ORM(Object-Relation Mapping)框架,允许开发者使用面向对象的方式与关系数据库交互。在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性...

    hibernate源码分析

    **Hibernate源码分析** Hibernate,一个著名的开源Java对象关系映射(ORM)框架,通过将Java对象和数据库表之间的映射关系自动化,极大地简化了数据访问层的开发工作。本篇将深入探讨Hibernate的源码,揭示其执行...

    hibernate源码包

    hibernate源码

    Hibernate源码解析(三)

    在阅读《Hibernate源码解析(三)》的过程中,配合hibernate源码分析(三).docx文档,读者可以更直观地理解这些概念,并可能涉及具体的类和方法,如`Query`、`SessionFactoryBuilder`、`EntityPersister`等。...

    Hibernate源码

    Hibernate源码分析有助于深入理解其内部机制,提高开发效率,优化数据库操作性能。 1. **Hibernate核心模块(hibernate-core)** Hibernate的核心模块包含了ORM框架的主要功能,如实体管理、查询语言(HQL)、事件...

    hibernate源码 直接使用

    标题"hibernate源码 直接使用"表明我们将探讨的是Hibernate框架的源代码,以及如何直接在项目中应用这些源代码。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,将数据库交互转化为面向...

    Hibernate源码(hibernate-orm-main.zip)

    Hibernate源码(hibernate-orm-main.zip)Source Code: Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。 它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

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

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

    hibernate 源码直接导入Eclipse

    接下来,我们将深入探讨Hibernate的核心概念、如何在Eclipse中导入源码以及如何利用这些源码进行学习。 1. Hibernate 核心概念: - ORM(Object-Relational Mapping):ORM是将数据库中的关系数据映射为Java对象的...

    传智播客hibernate源码

    - `Jpa_0914`: JPA(Java Persistence API)是Java平台上的ORM规范,与Hibernate有关,可能包含JPA的实现示例或与Hibernate的对比分析。 - `hibernate_080914`: 直接与Hibernate相关的源码或教程材料,可能涵盖...

    精通Hibernate源码.rar

    《精通Hibernate源码》 Hibernate,作为Java领域中的一款强大且广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,对于提升开发效率、优化性能以及解决实际问题具有重大意义。...

    hibernate源码

    《深入剖析Hibernate源码》 Hibernate,作为一款广泛使用的开源对象关系映射(ORM)框架,为Java开发者提供了强大的数据库操作支持。它将复杂的SQL语句隐藏在对象模型背后,使得开发人员能够专注于业务逻辑,而无需...

    Hibernate源码解析(二)

    通过源码级别的分析,我们可以洞察到Hibernate如何将Java对象与数据库表进行映射,以及它如何执行SQL查询和事务管理。 一、对象关系映射(ORM) Hibernate作为ORM工具,其主要任务是消除Java应用与关系数据库之间...

    hibernate源码的学习

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。...通过对"hibernate-one2many"的分析,我们可以深入研究和实践一对一和一对多关联关系的配置和操作。

Global site tag (gtag.js) - Google Analytics