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 Envers是Hibernate自带的一个强大的审计功能模块,它能自动记录数据库表的变更历史,为数据的追踪和回溯提供了便利。在5.2.10.Final版本中,Envers可能进行了性能和功能的优化,使得审计日志的生成和查询...
4. **日志库**:`log4j.jar` - Hibernate使用Log4j进行日志记录,帮助开发者追踪代码执行过程中的问题。需要配置`log4j.properties`文件以定制日志级别和输出位置。 5. **交易管理**:`jta.jar`(Java Transaction ...
这个压缩包包含了搭建Hibernate框架所必需的19个完整JAR包,这些库文件是Hibernate运行的核心组件,涵盖了从数据库连接、SQL解析到对象持久化等多个关键功能。 1. **Hibernate核心库**:hibernate-core.jar是...
8. **dom4j.jar**:XML处理库,Hibernate使用它来解析和生成XML配置文件。 9. **slf4j-api.jar**和**slf4j-log4j12.jar**:Simple Logging Facade for Java,提供了日志记录接口,通常与Log4j结合使用,方便调试和...
`jboss-logging-3.3.0.Final.jar`是一个日志框架,提供了统一的日志接口,便于Hibernate进行调试和问题追踪。 `classmate-1.3.0.jar`是用于解析Java类元数据的库,主要在Hibernate的自动类型发现和属性反射中发挥...
四、源码分析 深入源码可以帮助我们更清晰地理解这三个方法的工作原理。在Hibernate Core中,save()和persist()的实现基本相似,都通过调用IdentityGenerator生成ID,然后添加到持久化上下文。而merge()则涉及到了...
5. 使用日志分析工具:通过日志分析工具,可以对日志数据进行统计、分析,以提升系统性能和稳定性。 总的来说,Hibernate日志jar包是开发和维护过程中不可或缺的一部分,它帮助我们了解程序运行状况,提高问题解决...
本文档将详细解析Hibernate的各种可选配置,帮助开发者深入了解并合理利用这些配置,提升开发效率与应用性能。 #### 二、Hibernate核心配置详解 ##### 1. hibernate.dialect - **功能**:指定Hibernate使用的...
**Envers Hibernate 深度解析** Envers 是 Hibernate 的一个扩展模块,专门用于数据库记录的审计和历史版本管理。它允许开发者跟踪和记录数据库实体的变化,为用户提供了一种便捷的方式来查看和恢复过去的版本。本...
【Servlet+Hibernate 进销存系统】是一种基于Java技术的Web应用程序,主要针对初学者设计,提供了完整的源代码,方便学习和实践。该系统利用Servlet作为服务器端的控制层,Hibernate作为持久化框架来处理数据库操作...
4. **javassist-3.4.ga.jar**:Javaassist是一个开源库,它允许在运行时动态修改类和方法,Hibernate使用它来实现动态代理和元数据驱动的代码生成。 5. **log4j-1.2.13.jar**:Log4j是一个流行的日志记录框架,用于...
10. `jboss-logging-3.3.0.Final.jar`:这是JBoss日志库,提供了一种统一的日志框架,Hibernate使用它来进行日志输出,帮助开发者调试和追踪问题。 综上所述,这些JAR文件是构建一个使用Hibernate 5.0连接MySQL...
《基于SSH框架的客户关系管理系统源代码解析》 在当今的IT行业中,客户关系管理(CRM)系统扮演着至关重要的角色,它帮助企业更好地理解和管理与客户之间的互动。本项目是用Struts、Spring和Hibernate(简称SSH)三...
Hibernate是Java领域中一款...通过分析上述文件结构和概念,你可以学习如何配置Hibernate,创建和管理实体,执行CRUD操作,以及理解其工作原理。实践这些示例代码,将有助于你深入理解Hibernate在实际项目中的应用。
- 改动追踪与脏检查:理解Hibernate如何检测对象状态的变化,自动执行更新操作。 - 异步操作与事务管理:学习如何在Hibernate中处理并发,以及事务的隔离级别和回滚规则。 4. **Day04:优化与实战** - 查询优化...
- **自动代码生成**:根据数据库表结构自动生成对应的Java实体类以及Hibernate映射文件。 - **数据库逆向工程**:能够反向生成数据库表结构至Java实体类及Hibernate配置。 - **集成环境支持**:与Eclipse IDE深度...
这些JAR文件是构建和运行基于Hibernate的Java应用程序所必需的库,它们提供了必要的API、服务和实现,使得开发者能够方便地进行对象关系映射(ORM),将数据库操作转换为面向对象的代码。 描述中提到了几个特定的...
在这个 Demo 中,"Test" 文件可能是用于测试的代码或者配置文件,帮助验证 Spring MVC 和 Hibernate 的整合是否成功,以及CRM系统的各项功能是否正常工作。 通过这个整合示例,开发者可以学习到如何在实际项目中...
Eclipse 的 Hibernate Tools 是一组集成在 Eclipse IDE 中的插件,提供了诸如逆向工程(从数据库生成实体类)、代码生成、配置编辑等实用功能,使得 Hibernate 的开发更加便捷。 首先,让我们详细了解一下 ...
在标签中,“源码”意味着问题可能涉及到对Hibernate源代码的理解,或者需要通过阅读源码来定位问题。“工具”可能指代开发者使用的一些辅助工具,如IDE、调试器或者性能分析工具,这些工具在排查问题时可能会有所...