load方法

你真的了解load方法么?

空扰寡人 提交于 2020-04-07 03:52:35
本文授权转载,作者: 左书祺 (关注仓库,及时获得更新: iOS-Source-Code-Analyze ) 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 文章的标题与其说是问各位读者,不如说是问笔者自己:我真的了解 + load 方法么? + load 作为 Objective-C 中的一个方法,与其它方法有很大的不同。 它只是一个在整个文件被加载到运行时,在 main 函数调用之前被 ObjC 运行时调用的钩子方法。 其中关键字有这么几个: 文件刚加载 main 函数之前 钩子方法 我在阅读 ObjC 源代码之前,曾经一度感觉自己对 + load 方法的作用非常了解,直到看了源代码中的实现,才知道以前的以为,只是自己的以为罢了。 这篇文章会假设你知道: 使用过 + load 方法 知道 + load 方法的调用顺序(文章中会简单介绍) 在这篇文章中并不会用大篇幅介绍 + load 方法的作用其实也没几个作用,关注点主要在以下两个问题上: + load 方法是如何被调用的 + load 方法为什么会有这种调用顺序 load 方法的调用栈 首先来通过 load 方法的调用栈,分析一下它到底是如何被调用的。 下面是程序的全部代码:

Hibernate中get和load方法的区别

为君一笑 提交于 2019-11-29 05:56:59
1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。 2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论: (1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为 实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一 个ObjectNotFoundException。 (2)若为false,就跟Hibernate get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。 举例说明如下: load加载方法: Users user = (Users)session.load(Users. class , userId); get加载方法: Users user = (Users)session.get(Users. class , userId); 两加载方法区别: 区别1:如果数据库中,没有userId的对象。如果通过get方法加载