Hibernate中Session的load()和get()方法

    Session的load()方法和get()方法根据给定的对象id从数据库表中加载一条记录并转换为一个特定的持久类对象。load()方法在没有找到特定的持久类对象所对应的数据库表中的记录时,会抛出ObjectNotFoundException,而get()方法返回null。

    get()方法和load()方法返回的对象位于Session的缓存中,因此党对他的属性进行修改后,Session清理缓存时,会根据持久化对象的属性来同步更新数据库。

    load()和get()方法的区别:

   (1)load()方法:如果load方法不能再缓存或者数据库中找到对象,会抛出异常;load()方法从不返回null;load()方法返回一个代理类的实例而不是真正的持久实例。代理是一个占位符,当第一次调用他时才装载真正的对象。

    (2)get()方法:如果没有找到对象返回null,另一方面,get()方法从不返回代理类而是直接返回实体类。load()方法可以充分利用内部缓存和二级缓存中的现有数据,而get()方法仅仅在内部缓存中进行数据查找,如果没有发现对应的数据,将越过二级缓存,直接调用SQL完成数据读取。

    该如何选择load()方法和get()方法:

    (1)load()方法应用在对象存在的情况下加载

    (2)利用get()方法可以首先判断对象是否存在,然后在获得它。

/**
	 * 测试load方法
	 * 一旦加载了持久化实例之后,在代码中对持久化实例所做的修改,将会被保存到数据库中。
	 * 程序对持久化实例所做的修改会在session flush之前被自动保存到数据库中,
	 * 无需程序调用其他方法(不需要调用update方法)。也就是说修改对象的最简单方法就是在session处于打开状态时load它,
	 * 然后直接修改即可。这种方法有一个极大的性能缺陷:当需要修改某条记录的时候,这种做法会产生两条sql语句:
	 * 一条用于查询指定记录,一条用于修改该记录。
	 */
	public static void testLoad(){
		Configuration cfg = new Configuration().configure();
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();
		Company company = (Company) session.load(Company.class, 1);
		System.out.println(company.getShortName());
		company.setShortName("总公司");
		transaction.commit();
		session.close();
		System.out.println(company.getShortName());
	}
	
	/**
	 * 测试get方法
	 */
	public static void testGet(){
		Configuration cfg = new Configuration().configure();
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();
		Company company = (Company) session.get(Company.class, 1);
		System.out.println(company.getShortName());
		company.setShortName("总厂");
		transaction.commit();
		session.close();
		System.out.println(company.getShortName());
	}
	
	/**
	 * 测试load与get方法在数据库中没有匹配记录时的反应
	 * 该程序的输出为:get方法返回值为null。原因:
	 * 如果没有匹配的数据库记录,load方法可能抛出异常HibernateException;如果在类映射文件中指定延迟加载,
	 * 			则load方法会返回一个未初始化的代理对象,这个代理对象并没有装载数据库对象,直到程序调用该代理对象的某方法时,
	 * 			hibernate才访问数据库。默认情况下为延迟加载
	 * get方法立即访问数据库,如果没有对应的记录,get方法返回null
	 * 两者的主要区别在是否延迟加载。
	 */
	public static void testLoadAndGet(){
		Configuration cfg = new Configuration().configure();
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();
		Company company = (Company) session.get(Company.class, 11);
		if(company == null){
			System.out.println("get方法返回值为null");
		}
		Company company1 = (Company)session.load(Company.class, 11);
		if(company1 == null){
			System.out.println("load方法返回值为null");
		}
		transaction.commit();
		session.close();
	}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值