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