`

hibernate get() load() 方法区别

 
阅读更多

get和load区别

1.get()采用立即加载方式,返回的是有实体数据的对象,而load()采用延迟加载,返回的是代理对象
   a.get方法首先查询session缓存(一级缓存),如果该对象被代理过,返回代理对象,没有被代理过,
  返回实体类对象,在一级缓存里没有数据,就会查询二级缓存,最后查询数据库,是立即发出sql语句
  
   b.load方法也是首先查询session缓存(一级缓存),没有找到则创建代理类(注意此时不发出sql,也不  

  会报错,只是创建了代理对象),当使用时user时查找二级缓存,没有则查询数据库,此时才发出sql      

  语句

2.如果数据库中没有对应的记录,通过get方法加载,返回的是null;而通过load加载,当使用user时

  (如user.getName())会抛出异常:ObjectNotFoundException;

@Test
	public void testGetLoad() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		/*
		 *load返回的类型是代理对象,
		 *get返回的类型是返回有实体数据的对象,即
		 *1.该对象被代理过,返回代理对象
		 *2.该对象没有被代理过,返回实体类对象 
		 */
		//session缓存中没有id为6的对象
		User u1 = (User) session.load(User.class, 6);//不发sql语句,用到时才发出sql语句
		System.out.println(u1.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		System.out.println(u1.getName());//此时用到u1对象发sql语句,若数据库中有记录,则输出,若无则抛出异常:ObjectNotFoundException
		
		/*
		 * session缓存中id为6的对象被代理过,输出结果是代理对象
		 */
		User u2 = (User) session.get(User.class, 6);//不发sql语句,因为此时session缓存有(上面已load此id为6的对象)
		System.out.println(u2.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		System.out.println(u2.getName());//输出session缓存的数据
		
		User u3 = (User) session.load(User.class, 7);//不发sql语句
		System.out.println(u1.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		
		User u4 = (User) session.get(User.class, 7);//立即发sql语句(此对象缓存没有数据)
		System.out.println(u4.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		System.out.println(u4.getName());//输出查询的数据
		
		//session缓存中id为7的对象没有被代理过,输出的结果是实例类对象
		User u5 = (User) session.get(User.class, 8);//立即发sql语句
		System.out.println(u5.getClass());//输出结果:class com.test.pojo.User
		session.getTransaction().commit();
		
	}

结果:

 

class com.test.pojo.User_$$_javassist_0
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from User user0_ where user0_.id=?
zhangsan
class com.test.pojo.User_$$_javassist_0
zhangsan
class com.test.pojo.User_$$_javassist_0
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from User user0_ where user0_.id=?
class com.test.pojo.User_$$_javassist_0
zhangsan
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from User user0_ where user0_.id=?
class com.test.pojo.User

 

分享到:
评论

相关推荐

    hibernate get load区别

    ### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...

    hibernate中get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...

    Hibernate的get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...

    Hibernate查询 load与get的区别及其它查询测试

    `load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    hibernate中get和load的区别共5页.pdf

    总的来说,理解Hibernate的`get`和`load`方法的区别是优化数据库操作、提高应用程序性能的关键。开发者应当根据实际情况灵活选择,避免不必要的性能开销,同时充分利用Hibernate的缓存机制来提升应用的响应速度。

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的区别: 1. **返回结果对比**: - `load`方法如果找不到对应的记录,会抛出`org.hibernate....

    Hibernate中load方法与get方法的区别

    在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...

    session的get与load比较

    本文将深入探讨`get`与`load`两种方法的区别及其应用场景。 #### 一、基本概念 在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存...

    Hibernate中get()和load()的区别.docx

    在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...

    Hibernate中Session.get()方法和load()方法的详细比较

    Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...

    hibernate get/load/saveOrUpdate/statistics

    博文链接:https://log-cd.iteye.com/blog/205166

    Hibernate方法总结

    而`load`方法返回的是一个代理对象,即使数据库中没有对应的记录,它也会返回一个空的代理对象,只有当真正访问属性时才会抛出`EntityNotFoundException`异常。因此,当你确定对象一定存在时,可以使用`get`;不确定...

    Hibernate的Template方法以及SQL简介

    与`get`方法类似,但`load`方法会在找不到对应实体时抛出异常。 3. **全表查询** ```java Query query = session.createQuery("from Order"); List<Order> list = query.list(); ``` 此方法用于查询表中的...

    hibernate难点重点笔记

    本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...

    Hibernate查询解决方案

    本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...

    hibernate3 hibernate3

    使用get()和load()方法检索对象,使用Criteria或HQL查询对象集合。 5. 提交事务:在一组数据库操作完成后,使用Session的commit()方法提交事务。如果发生错误,可以调用rollback()回滚事务。 6. 关闭Session:每次...

Global site tag (gtag.js) - Google Analytics