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`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
总的来说,理解Hibernate的`get`和`load`方法的区别是优化数据库操作、提高应用程序性能的关键。开发者应当根据实际情况灵活选择,避免不必要的性能开销,同时充分利用Hibernate的缓存机制来提升应用的响应速度。
本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的区别: 1. **返回结果对比**: - `load`方法如果找不到对应的记录,会抛出`org.hibernate....
在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...
本文将深入探讨`get`与`load`两种方法的区别及其应用场景。 #### 一、基本概念 在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存...
在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
博文链接:https://log-cd.iteye.com/blog/205166
而`load`方法返回的是一个代理对象,即使数据库中没有对应的记录,它也会返回一个空的代理对象,只有当真正访问属性时才会抛出`EntityNotFoundException`异常。因此,当你确定对象一定存在时,可以使用`get`;不确定...
与`get`方法类似,但`load`方法会在找不到对应实体时抛出异常。 3. **全表查询** ```java Query query = session.createQuery("from Order"); List<Order> list = query.list(); ``` 此方法用于查询表中的...
本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...
本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...
使用get()和load()方法检索对象,使用Criteria或HQL查询对象集合。 5. 提交事务:在一组数据库操作完成后,使用Session的commit()方法提交事务。如果发生错误,可以调用rollback()回滚事务。 6. 关闭Session:每次...