`
橙臣1314
  • 浏览: 6658 次
社区版块
存档分类
最新评论

Hibernate代码分析追踪

阅读更多
Hibernate一般被我们作为数据库持久化工具使用,下面是我在使用过程中对工具使用过程中调试跟踪的一些记录。

我们一般在applicationContext.xml里如上配置,打开类AnnotationSessionFactoryBean.java,看该类的构造函数及父类的构造函数
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
</bean>



public AnnotationSessionFactoryBean() {
         setConfigurationClass(AnnotationConfiguration.class);
 }

public AnnotationSessionFactoryBean() {

        setConfigurationClass(AnnotationConfiguration.class);        
}        
@Override        
public void setConfigurationClass(Class configurationClass) {                
        if (configurationClass == null || !AnnotationConfiguration.class.isAssignableFrom(configurationClass)) {
                throw new IllegalArgumentException( "AnnotationSessionFactoryBean only supports AnnotationConfiguration or subclasses");                
        }                
        super.setConfigurationClass(configurationClass);        
}





org.hibernate.cfg.Configuration  doConfig(File f)会使用hibernate.cfg.xml配置好之后调用buildSessionFactory()

org.springframework.beans.factory.InitializingBean  void afterPropertiesSet()方法可见,bean的配置参数设置之后,该函数会被调用


org.springframework.orm.hibernate3.AbstractSessionFactoryBean 作为AnnotationSessionFactoryBean的父类实现了该接口,于是sessionFactory被构造出来。

public void afterPropertiesSet() throws Exception {                
        SessionFactory rawSf = buildSessionFactory();                
        this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf);
        afterSessionFactoryCreation();        
}

我们在dao层一般使用getSession().load(id);getSession().save(obj);getSession().delete(obj)getSession().update(obj);等等方式实现CRUD,这些都会调用到org.session.impl.sessionImpl类下面的fireDelete(pram...),fireLoad(pram...),fireSaveOrUpdate(pram...)等方法,以delete为例子添加进去的deleteEventListener调用onDelete(DeleteEventevent)方法---》
publicvoid onDelete(DeleteEvent event, Set transientEntities)


EntityEntry entityEntry = persistenceContext.getEntry( entity );                
if ( entityEntry == null ) {}                
else {                       
 log.trace( "deleting a persistent instance" );                        
if ( entityEntry.getStatus() == Status.DELETED || entityEntry.getStatus() == Status.GONE ) {                               
 log.trace( "object was already deleted" );                               
 return;                        
}                        
persister = entityEntry.getPersister();                       
 id = entityEntry.getId();                        
version = entityEntry.getVersion();                
}
deleteEntity( source, entity, entityEntry, event.isCascadeDeleteEnabled(), persister, transientEntities );

可以看出,需要现在持久层查找该实体,找不到需要添加到持久层,找到了就可以准备删除。然后跳转deleteEntity方法,
session.getActionQueue().addAction(
				new EntityDeleteAction(
						entityEntry.getId(),
						deletedState,
						version,
						entity,
						persister,
						isCascadeDeleteEnabled,
						session
				)
		);

查看该Action的excute方法,
    final CacheKey ck;if (persister.hasCache() ) {
    ck = new CacheKey( ...);
lock = persister.getCacheAccessStrategy().lockItem( ck, version );}


并锁定缓存中的该数据,下方代码显示,需在缓存中删除,但我看不出来persistenceContext.removeEntity()和cacheAccessStrategy.remove的区别,知道的还请告知。
 if ( !isCascadeDeleteEnabled && !veto ) {                        
         persister.delete( id, version, instance, session );                
}                                
final PersistenceContext persistenceContext = session.getPersistenceContext();
EntityEntry entry = persistenceContext.removeEntry( instance );  
if ( entry == null ) {                        
         throw new AssertionFailure( "possible nonthreadsafe access to session" );               
 } 
 entry.postDelete(); 
persistenceContext.removeEntity( entry.getEntityKey() );
persistenceContext.removeProxy( entry.getEntityKey() );                                
if ( persister.hasCache() ) { 
      persister.getCacheAccessStrategy().remove( ck );                
}

而查询load不同,会涉及到sessionCache与secondLevelCache。

Object doLoad(final LoadEvent event,                        
final EntityPersister persister,                       
final EntityKey keyToLoad,                        
final LoadEventListener.LoadType options) {
    Object entity = loadFromSessionCache( event, keyToLoad, options ); 
              return entity;
                }       
         entity = loadFromSecondLevelCache(event, persister, options);        
        if ( entity != null ) {           
          return entity
             }
             return loadFromDatasource(event, persister, keyToLoad, options);
}

顺序是先一级缓存,然后二级缓存,然后数据库。在不同位置找到有不同处理,如果从数据库来,要将该实体添加至SessionCache里,如果从二级缓存来我看不出来做什么了。

暂时到这,github: http://github.com/leechedan/startSpring





分享到:
评论

相关推荐

    hibernate-release-5.2.10.Final

    Hibernate Envers是Hibernate自带的一个强大的审计功能模块,它能自动记录数据库表的变更历史,为数据的追踪和回溯提供了便利。在5.2.10.Final版本中,Envers可能进行了性能和功能的优化,使得审计日志的生成和查询...

    hibernate开发所依赖的jar包

    4. **日志库**:`log4j.jar` - Hibernate使用Log4j进行日志记录,帮助开发者追踪代码执行过程中的问题。需要配置`log4j.properties`文件以定制日志级别和输出位置。 5. **交易管理**:`jta.jar`(Java Transaction ...

    hibernate完整JAR包

    这个压缩包包含了搭建Hibernate框架所必需的19个完整JAR包,这些库文件是Hibernate运行的核心组件,涵盖了从数据库连接、SQL解析到对象持久化等多个关键功能。 1. **Hibernate核心库**:hibernate-core.jar是...

    hibernate3资源包

    8. **dom4j.jar**:XML处理库,Hibernate使用它来解析和生成XML配置文件。 9. **slf4j-api.jar**和**slf4j-log4j12.jar**:Simple Logging Facade for Java,提供了日志记录接口,通常与Log4j结合使用,方便调试和...

    Hibernate 核心类库

    `jboss-logging-3.3.0.Final.jar`是一个日志框架,提供了统一的日志接口,便于Hibernate进行调试和问题追踪。 `classmate-1.3.0.jar`是用于解析Java类元数据的库,主要在Hibernate的自动类型发现和属性反射中发挥...

    Hibernate save persist merge探究

    四、源码分析 深入源码可以帮助我们更清晰地理解这三个方法的工作原理。在Hibernate Core中,save()和persist()的实现基本相似,都通过调用IdentityGenerator生成ID,然后添加到持久化上下文。而merge()则涉及到了...

    Hibernate日志jar包

    5. 使用日志分析工具:通过日志分析工具,可以对日志数据进行统计、分析,以提升系统性能和稳定性。 总的来说,Hibernate日志jar包是开发和维护过程中不可或缺的一部分,它帮助我们了解程序运行状况,提高问题解决...

    Hibernate可选配置大全

    本文档将详细解析Hibernate的各种可选配置,帮助开发者深入了解并合理利用这些配置,提升开发效率与应用性能。 #### 二、Hibernate核心配置详解 ##### 1. hibernate.dialect - **功能**:指定Hibernate使用的...

    envers hibernate

    **Envers Hibernate 深度解析** Envers 是 Hibernate 的一个扩展模块,专门用于数据库记录的审计和历史版本管理。它允许开发者跟踪和记录数据库实体的变化,为用户提供了一种便捷的方式来查看和恢复过去的版本。本...

    Serlvet+Hibernate 进销存系统 适合初学者,代码完整

    【Servlet+Hibernate 进销存系统】是一种基于Java技术的Web应用程序,主要针对初学者设计,提供了完整的源代码,方便学习和实践。该系统利用Servlet作为服务器端的控制层,Hibernate作为持久化框架来处理数据库操作...

    hibernate jpa开发需要的所有包

    4. **javassist-3.4.ga.jar**:Javaassist是一个开源库,它允许在运行时动态修改类和方法,Hibernate使用它来实现动态代理和元数据驱动的代码生成。 5. **log4j-1.2.13.jar**:Log4j是一个流行的日志记录框架,用于...

    Hibernate5.0需要的JAR包

    10. `jboss-logging-3.3.0.Final.jar`:这是JBoss日志库,提供了一种统一的日志框架,Hibernate使用它来进行日志输出,帮助开发者调试和追踪问题。 综上所述,这些JAR文件是构建一个使用Hibernate 5.0连接MySQL...

    客户关系管理系统源代码用(struts-spring-hibernate)开发

    《基于SSH框架的客户关系管理系统源代码解析》 在当今的IT行业中,客户关系管理(CRM)系统扮演着至关重要的角色,它帮助企业更好地理解和管理与客户之间的互动。本项目是用Struts、Spring和Hibernate(简称SSH)三...

    Hibernate基础知识演示代码

    Hibernate是Java领域中一款...通过分析上述文件结构和概念,你可以学习如何配置Hibernate,创建和管理实体,执行CRUD操作,以及理解其工作原理。实践这些示例代码,将有助于你深入理解Hibernate在实际项目中的应用。

    传智播客-hibernate框架开发视频第day01-day04资料

    - 改动追踪与脏检查:理解Hibernate如何检测对象状态的变化,自动执行更新操作。 - 异步操作与事务管理:学习如何在Hibernate中处理并发,以及事务的隔离级别和回滚规则。 4. **Day04:优化与实战** - 查询优化...

    hibernatetools文档

    - **自动代码生成**:根据数据库表结构自动生成对应的Java实体类以及Hibernate映射文件。 - **数据库逆向工程**:能够反向生成数据库表结构至Java实体类及Hibernate配置。 - **集成环境支持**:与Eclipse IDE深度...

    hibernate Jars

    这些JAR文件是构建和运行基于Hibernate的Java应用程序所必需的库,它们提供了必要的API、服务和实现,使得开发者能够方便地进行对象关系映射(ORM),将数据库操作转换为面向对象的代码。 描述中提到了几个特定的...

    Springmvc+hibernate整合Demo

    在这个 Demo 中,"Test" 文件可能是用于测试的代码或者配置文件,帮助验证 Spring MVC 和 Hibernate 的整合是否成功,以及CRM系统的各项功能是否正常工作。 通过这个整合示例,开发者可以学习到如何在实际项目中...

    eclipse 下的hibernate tools

    Eclipse 的 Hibernate Tools 是一组集成在 Eclipse IDE 中的插件,提供了诸如逆向工程(从数据库生成实体类)、代码生成、配置编辑等实用功能,使得 Hibernate 的开发更加便捷。 首先,让我们详细了解一下 ...

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

    在标签中,“源码”意味着问题可能涉及到对Hibernate源代码的理解,或者需要通过阅读源码来定位问题。“工具”可能指代开发者使用的一些辅助工具,如IDE、调试器或者性能分析工具,这些工具在排查问题时可能会有所...

Global site tag (gtag.js) - Google Analytics