Hibernate学习之------>Hibernate 中session的get()和load()比较

简介: load读取: Java代码   Users user = (Users)session.load(Users.class, userId);       get读取: Java代码   Users user = (Users)session.

load读取:

Java代码  收藏代码
  1. Users user = (Users)session.load(Users.class, userId);  

 

 

get读取:

Java代码  收藏代码
  1. Users user = (Users)session.get(Users.class, userId);   

 

区别1:

    1. load()方法从来就是假定数据在数据库中是存在的,在使用时如果不存在则会抛出ObjectNotFoundException;而get()方法不会假定数据在数据库中存在,如果不存在则返回null
    2. load()方法返回的是实体类的代理类,因此load()可以使用延迟加载策略来加载对象
      get()方法返回的不一定是实体类,可能是代理类,因为get()方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。
    3. load()方法查询数据时会先从session缓存(一级缓存)中查找,如果没有找到则会创建代理类,该代理类仅仅初始化了OID属性,当第一次访问其他属性值时,则会依次从二级缓存-->数据库查找,直到找到数据,最后将所有属性值赋给代理类。而get()方法则会直接按照一级缓存-->二级缓存-->数据库的顺序查找。

    4. 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据

 

也就是说:

Java代码  收藏代码
  1. Users user = (Users)session.load(Users.class, userId);   

这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

而:

 

Java代码  收藏代码
  1. Users user = (Users)session.get(Users.class, userId);    

 则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

 

注意:

Java代码  收藏代码
  1. Users user = (Users)session.load(Users.class, userId);     
  2. System.out.println(user.getId());   

上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

 

并且注意:这两个方法的第二个参数id,它必须是实现了java.io.Serializable接口,也就是可序列化的。

 

相关文章
|
缓存 Oracle Java
hibernate学习之三(悲观锁与乐观锁)
hibernate学习之三(悲观锁与乐观锁)
|
SQL Java 数据库连接
Hibernate中Session的load和get方法的区别是什么?
主要有以下三项区别: ① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。 ② get方法直接返回实体类对象,load方法返回实体类对象的代理。
1074 0
|
Java 数据库连接 数据库
Hibernate学习之Hibernate注解总结
Hibernate学习之Hibernate注解总结http://www.bieryun.com/3269.html 一、类级别的注解 @Entity name:表的名字(可选)一般表名和类名相同 必须指定主键属性@Id @Table name:映射表的名称(可选) catalog:目录(可选)默认为空 schema:模式(可选)默认为空 与@Entity注解配合使用,只能表示在实体类class定义处,表示实体类对应数据库表的信息 @Embeddable 表示一个非Entity类,不是一个实体类,可以嵌入到实体类中作为一个属性存在。
1647 0
|
缓存 Java 数据库连接
Hibernate-ORM:04.Hibernate中的get()和load()
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配置不做重复展示,见谅)   Hibernate中查询单个,...
1173 0
|
Java 数据库连接 数据库
Hibernate学习之Hibernate注解总结
Hibernate学习之Hibernate注解总结 一、类级别的注解 @Entity name:表的名字(可选)一般表名和类名相同 必须指定主键属性@Id @Table name:映射表的名称(可选) catalog:目录(可选)默认为空 schema:模式(可选)默认为空 与@Entity注解配合使用,只能表示在实体类class定义处,表示实体类对应数据库表的信息 @Embeddable 表示一个非Entity类,不是一个实体类,可以嵌入到实体类中作为一个属性存在。
1323 0
|
Java 数据库连接 数据库