hibernate中session.get( , )和session.load( , )的使用及区别

get(Class clazz,id)和load(Class clazz,id)都是用来根据主键的内容查询数据库中数据,并且返回相对应的类的对象

用法如下:

public static void main(String[] args) {
		//读取总的配置文件
		Configuration configuration = new Configuration().configure();
		//创建sessionFactory
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		//得到session
		Session session = sessionFactory.openSession();
		//开启事务
		Transaction transaction = session.beginTransaction();
                //查询出User类所对应的表中的主键值为1的整行数据,并且将其所有字段的值一    一对应的赋值给User类中的属性
		User user = (User) session.load(User.class, 1);
                //提交事务
		transaction.commit();
                //关闭session
		session.close();
	}

load()方法查询过程:

load()先到session缓存(即一级缓存)中去查,然后再去二级缓存中去查,如果都没有则返回一个代理对象(可以把它理解成一个假“”的对象,一个替身。等后面使用这个代理对象进行操作时,才去数据库中查,这就是懒加载的过程。这个对象可以自动转化成实体对象,但当代理对象被调用的时候如果数据库中此数据不存在,就会抛出ObjectNotFoundException

get()方法查询过程:
    先到session缓存(即一级缓存)中去查,如果查不到再去二级缓存中去查,如果都没有找到就马上向数据库发送查询的请求(sql语句)

get 和 load 的区别:
    1) 如果查询不到相对应的数据,get 返回的是一个空对象,即 null。load 则报ObjectNotFoundException
    2) 使用get去查询数据会立即向数据库发送查询请求(即查询的sql语句)。如果使用load 方法,则属于懒加载。它才先后去一级缓存和二级缓存中去查找,如果这里面都没有,则返回一个代理对象,如果下面的代码中没有用到所查询出来的类对象,那么它就不向数据库发送查询请求。直到程序员在下面的代码中使用了查询结果的时候,就真正的向数据库发送出查询的sql语句

    3)懒加载就是一种优化,就相当于 : 如果查询的结果你都不用,那我为什么要帮你去查?

如何在使用load方法的时候,不使用懒加载?

在对象关系映射文件中(即.hbm.xml文件)的<class name="" table="">标签中加入一个属性:lazy="false" 即:

<class name="" lazy="false" table=""> <!--lazy这个属性默认的是true-->

何时使用get? 何时使用load??

扫描二维码关注公众号,回复: 3482077 查看本文章

如果确定数据库中有所要查询的数据,那么就用load,因为这样子的话即不会报ObjectNotFoundException,效率还高。不确定的话就用get

猜你喜欢

转载自blog.csdn.net/My_name_is_ZwZ/article/details/82843360