`

Hibernate源码研究碎得(十四): EntityKey类的作用及研究方法收获

阅读更多

   在博客"http://rmn190.iteye.com/blog/194228"中提出了EntityKey这个类是干啥的问题, 当时也没能想通这个类是做啥的, 只是看了下这个类里某些方法的实现. 今天把回过关再源码及这个类实例的应用场景说一下, 也就可以得出相对正确的结果了.

    这次看EntityKey时没有过多的纠缠到这个类方法的实现上, 更多地看它的JavaDocs里的描述信息(这个关注点的转变是一个提高), 发现有这么条信息"
Uniquely identifies of an entity instance in a particular session by identifier, Uniqueing information consists of the entity-name and the identifier value ". 这句话的大概意思是说: 这个类用来表现一个entity instance的ID, 而这个ID是存在Session缓存中的. 有了这个信息, 我们就大致可以判定这个类的用处: 当取一个类在数据库的信息时, Hibernate会用这个类信息对应的 EntityKey去Session缓存中去取;若没取到, 那Hibernate就只能真正到数据库中里取记录了, 取出来后,new一个EntityKey作为Map的key把取回来的信息放到Session缓存中去.

   有了这样的猜想, 我们再看后续的代码,有这样的方法调用
loadFromSessionCache( event, keyToLoad, options ),再追下去,我们看到了Map的get方法, 这个get方法的参数也就是前面传来的keyToLoad.这就验证了上面猜想中从Session缓存中取值的说法.

    再看
loadFromDatasource方法里(很深很深的调用), 有这样的语句: loadFromResultSet(............), 源码中对个方法的注释是这样的" grab its state from the ResultSet and keep it in the Session ", 也就是说从ResultSet里取出想要的Object后再把这个东东以那个EntityKey为key存放到Session缓存中(缓存以Map实现). 这也就验证了上面猜想中取出数据后往Session缓存中放值的说法.


   写到这里还不算完, 若只是停留在这个层次,研究源码也就少了一个收获, 咱们都是学过哲学的, 怎么也得提升到方法论的层面吧: 钓到了一条鱼,我们除了高兴的吃了,再更有意义的是不是总结下钓鱼的经验呢? 这也是一样, 我总结的经验如下:
       1,
JavaDocs中对一个类的描述来看类的作用. 以前很少看这些描述信息的, 这次的收获让我对这样的类描述信息有了个很实用很直观的感觉. 这个可以说是静态的看信息.
        2,
从形参的命名来看一个类的作用. 应该说, 一个好的开源项目是很正规的, 这样的方法形参的命名就可以帮助我们看到某一个的作用. 这个就是在现场看运行时信息了.

 

    总结了钓鱼方法后,我们的钓鱼技巧也会更快地提高Di.

分享到:
评论

相关推荐

    用友U9自定义单据(高级).pdf

    为了进一步提升用户对系统的掌握程度及扩展能力,《用友U9自定义单据(高级)》课程旨在帮助学员在掌握了《自定义单据(初级)》课程的基础上,更深入地理解前后台编程接口和编程方法,从而能够灵活应用这些技术来...

    esql查询分析器(含源码)

    2. **实体命名**:在ESQL中,你可以使用`EntitySet`名称来引用表,`EntityKey`来标识特定记录,以及`NavigationProperty`来导航关联。 3. **函数支持**:ESQL支持多种内置函数,如数学函数(如`COUNT`,`SUM`),...

    NET4.0类库图098-115952-NETFX4-Poster.pdf

    1. **System.Data**:EntityKey、IExtendedDataRecord的更新,以及DbCommandTree、DbExpression、DbQueryCommandTree和DbExpressionBuilder等类的更新,表明了.NET Framework 4.0在数据访问和查询方面的改进,尤其在...

    C# GroupBy的基本使用教程

    例如,在上面的示例代码中,我们使用了一个名为 `EntityKey` 的类来定义键类型,避免了匿名类型的使用。 四、 总结 本文详细介绍了 C# 中 GroupBy 方法的基本使用教程,包括其基本概念、使用场景和常见问题解决...

    WCF里使用EF的poco生成数据契约的小例子

    在EF中,POCO类没有继承自EF的EntityObject,也没有包含任何EF特定的属性(如EntityKey)。这使得POCO类可以独立于EF工作,方便在WCF服务中使用。 2. **为什么要在WCF中使用EF的POCO?** 使用POCO作为数据契约可以...

    ttms最终版.zip

    - `EntityKey.dat`:可能包含了系统中各种实体(如剧目、场次、工作室等)的关键信息,用于快速检索和关联操作。 - `Play.dat`:剧目信息,包括剧名、时长、导演、演员等。 - `Schedule.dat`:演出日程安排,记录...

    ADO.NET EF中的实体修改方法

    本文将详细讲解两种主要的实体修改方法:传统修改模式和使用`ApplyPropertyChanges`方法。 首先,让我们来看看**传统修改模式**。在EF中,如果你已经加载了一个实体并对其进行修改,然后调用`SaveChanges()`,EF会...

    microsoft.net.framework.2.0 Microsoft .NET Framework v2.0

    类库则是一系列预先编写好的类和接口,供开发者在编程时调用,涵盖了数据库访问、网络通信、图形绘制等多个领域。 二、新特性和改进 1. 改进的CLR:.NET Framework 2.0的CLR进行了多项优化,包括更快的启动时间和...

    .NET Framework 类库参考手册(System.Data 命名空间) [微软官方 MSDN 节选]

    EntityKey EntityKeyMember EntitySqlException EnumerableRowCollection EnumerableRowCollection TRow EnumerableRowCollectionExtensions EvaluateException FillErrorEventArgs ForeignKeyConstraint ...

    用友U9自定义审批流(开发).pdf

    本文将详细介绍用友U9中自定义审批流的开发方法,帮助开发者更好地理解和掌握这一功能。 #### 二、课程概述 本课程旨在帮助学员理解并掌握用友U9自定义审批流的开发流程和技术要点。主要内容包括后台模型开发、前...

    odata-client:OData客户端库

    OData(Open Data Protocol)是一种开放的数据访问协议,它提供了一种标准的方法来创建、查询、更新和删除数据,适用于多种编程语言和平台。"odata-client"是专为PHP设计的一个OData客户端库,用于简化与OData服务的...

    ZZDownloader

    ZZ下载器用法实现子类继承基类ZZDownloadBaseEntity并实现ZZDownloadParserProtocol 实现子类...operation.key = [entity entityKey ]; [[ZZDownloadTaskManagerV2 shared ] addOp: operation withEntity: entity block

Global site tag (gtag.js) - Google Analytics