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
相关推荐
get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库
NULL 博文链接:https://ysj5125094.iteye.com/blog/1897557
NULL 博文链接:https://811417208-qq-com.iteye.com/blog/506950
Hibernate Session中的 flush方法的作用 get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org....
hibernate中get和load的区别共5页.pdf.zip
NULL 博文链接:https://quicker.iteye.com/blog/658451
NULL 博文链接:https://cici9898-007.iteye.com/blog/1847710
Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的
博文链接:https://log-cd.iteye.com/blog/205166
Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别。 1. get() 使用get()来根据ID进行单条查询: User user=session.get(User.class, "1"); 当get()方法被调用的时候...
今天小编就为大家分享一篇关于Hibernate中Session.get()方法和load()方法的详细比较,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略
Hibernate 难点解析: hibernate中uuid和...Hibernate get与load的区别 hibernate二级缓存中list和iterator的用法 Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别
//该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...
1、get()方法 2、load()方法 3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一...
04_Session接口及get|load|persist方法 05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_...
Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get...