`

hibernate中get和load方法的区别

阅读更多

 

hibernate的准备及配置工作参见我的另一篇文章(该文章中介绍hibernate的搭建及简单配置) : http://ysj5125094.iteye.com/blog/1893871

下面的实现类是用JUnit测试的,如果想了解JUnit内容请参见我的另一篇文章: http://ysj5125094.iteye.com/blog/1897295

 

首先简单说一下get()和load()方法的区别,下面有具体的例子做验证。

get   : 不支持lazy ; 当要查询的记录不存在时,返回null。

load : 支持lazy ; 当要查询的记录不存在时,返回ObjectNotFoundException异常。

get和load都只能查询一条记录、并且get和load的查询条件必须是主键。

名词解释: lazy(延迟加载/懒加载),执行该方法时不与数据库打交道,也就是不执行查询操作,当用到该对象时,才执行查询操作。

 

下面是SessionTest.java类,主要看testGet和testLoad方法(本类是用JUnit实现测试的,读者可以用main测试,或者观看我的另外一篇文章,用JUnit实现):

package com.ysj;

import java.io.Serializable;
import java.util.Date;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.ysj.utils.HibernateUtils;

public class SessionTest extends TestCase {
	
	/**
	 * 持久化对象生命周期的过程演示
	 */
	public void testSave(){
		Session session = null ;
		Transaction tran = null ;
		User user = null ;
		try{
			session = HibernateUtils.getSession() ;
			tran = session.beginTransaction() ;
			/**
			 * Transient(瞬态) :
			 * 1、在数据库中没有与之匹配的数据;
			 * 2、没有纳入session的管理;
			 * 3、如果在瞬态session 调用了 save()等方法就变为了持久态;
			 */  
			user = new User() ;
			user.setName("小一") ;
			user.setPassword("xiaoyi") ;
			user.setCreateTime(new Date()) ;
			user.setExpireTime(new Date()) ;
			/**
			 * Persistent(持久态) :
			 * 1、persistent状态的对象在数据库中有与之匹配的数据;
			 * 2、纳入了session的管理;
			 * 3、在清理缓存(脏数据检查)的时候,会和数据库同步;
			 * 4、在session关闭后,在持久态里面的内容,变为托管态,数据如果修改不会影响数据库对应值;
			 */
			session.save(user);
			
			user.setName("小二");
			/*
			 * 注意 :
			 * 在执行完tran.commit()方法后,会在控制台输出两条SQL语句,分别是
			 * Hibernate: insert into t_user (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
			 * Hibernate: update t_user set name=?, password=?, createTime=?, expireTime=? where id=?
			 * 
			 * session.save(user); // 执行到save()方法时插入数据库一条记录。
			 * user.setName("小二"); // 当对持久态对象进行修改时,会执行update操作。相当于在该条词句下面显示执行session.update(user);操作。 
			 */
			tran.commit() ;
			
		}catch(Exception e){
			if(tran != null){
				tran.rollback() ;
			}
			e.printStackTrace() ;
		}finally{
			HibernateUtils.closeSession(session);
		}
		/**
		 * Detached(托管态) :
		 * 1、在数据库中有与之匹配的数据;
		 * 2、没有纳入session的管理;
		 * 3、托管态对象中有主键值,瞬态的id没有主键值
		 */
		user.setName("小三") ;
		try{
			session = HibernateUtils.getSession() ;
			session.beginTransaction() ;
			/*
			 * 将detached对象重新纳入session管理,此时将变为persistent状态的对象。
			 * persistent状态的对象,在清理缓存时会和数据库同步。
			 */
			session.update(user);
			session.getTransaction().commit() ;
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}
	
	/**
	 * 练习get方法
	 */
	public void testGet(){
		Session session = null ;
		try{
			session = HibernateUtils.getSession() ;
			session.beginTransaction() ;
			/**
			 * get方法的两个参数介绍:
			 * get(Class clazz, Serializable id) : clazz/要返回的持久化类型; id/必须是数据库中的主键; 返回值类型/要么是一个持久化对象的实例,要么是null ;
			 * 
			 * get简单介绍 : 
			 * 1.get加载上来的对象为持久对象 ;
			 * 2.执行get会马上发出查询语句 ;
			 * 3.get方法加载数据,如果不存在则返回null ;
			 * 
			 */
			User user = (User)session.get(User.class, "4028812b3f9e3af3013f9e3af4430001");
			if(user != null){
				/*
				 * 1.Persistent状态的对象,当对象的属性发生改变的时候 ;
				 * 2.hibernate在清理缓存(脏数据检查)的时候,会和数据库同步 ;
				 */
				System.out.println(user.getName()) ;
				user.setName("小四") ;
			}
			session.getTransaction().commit() ;
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}
	
	/**
	 * 练习load方法
	 */
	public void testLoad(){
		Session session = null ;
		try{
			session = HibernateUtils.getSession() ;
			session.beginTransaction() ;
			/**
			 * load方法的两个参数介绍:
			 * load(Class clazz, Serializable id) : clazz/要返回的持久化类型; id/必须是数据库中的主键; 返回值类型/要么是一个持久化对象的实例(采用代理对象实现),要么是ObjectNotFoundException异常 ;
			 * 
			 * load简单介绍 : 
			 * 1.load加载上来的对象为持久对象 ;
			 * 2.执行get不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载) ;
			 * 3.get方法加载数据,如果不存在则hibernate会抛出ObjectNotFoundException异常 ;
			 * 
			 * 什么叫lazy?
			 * 对于hibernate来说只有真正使用这个对象的时候,再创建,才真正的发出查询语句,这样主要是为了提高性能 ;
			 * lazy是hibernate中非常重要的特性 ;
			 */
			User user = (User)session.load(User.class, "4028812b3f9e8b20013f9e8b22340001");
			
			/*
			 * 1.Persistent状态的对象,当对象的属性发生改变的时候 ;
			 * 2.hibernate在清理缓存(脏数据检查)的时候,会和数据库同步 ;
			 */
			System.out.println(user.getName()) ;
			user.setName("小五") ;
			session.getTransaction().commit() ;
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}
}

 

HibernateUtils.java代码如下:

package com.ysj.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


public class HibernateUtils {
	
	/**
	 * 创建静态块,用于初始化SessionFactory
	 */
	private static SessionFactory factory ;
	static{
		try{
			// 默认获取src根目录下的 hibernate.cfg.xml配置文件
			Configuration cfg = new Configuration().configure();
			// 通过配置文件获取 sessionFactory
			factory = cfg.buildSessionFactory() ; 
		}catch(Exception e){
			e.printStackTrace() ;
		}
	}
	
	/**
	 * 获得SessionFactory
	 */
	public static SessionFactory getSessionFactory(){
		return factory ;
	}
	
	/**
	 * 获得Session
	 */
	public static Session getSession(){
		if(factory != null){
			return factory.openSession() ;
		}else{
			return null ;
		}
	}
	
	/**
	 * 关闭Session
	 */
	public static void closeSession(Session session){
		if(session != null){
			if(session.isOpen()){
				session.close() ;
				session = null ;
			}
		}
	}
}

  

 

 

附件中存放的是用MyEclipse6.0的File System导出的练习工程,有需要的可以直接下载解压导入进行测试.

附件内容包括:save,get,load,query,JUnit的练习和生命周期的介绍。下载后先读readme.txt。

 

 

 

分享到:
评论

相关推荐

    Hibernate的get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...

    hibernate get load区别

    ### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...

    hibernate中get和load的区别共5页.pdf

    在Java的持久化框架Hibernate中,`get`和`load`是两个常用的方法,它们都是用来从数据库中获取对象的。然而,它们在工作原理和使用场景上存在一些关键的区别,这些区别对于理解和优化Hibernate应用至关重要。 首先...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    在Hibernate框架中,Session是与数据库交互的主要接口,它提供了...了解这些概念和方法的区别对于高效地使用Hibernate进行数据库操作至关重要,可以根据具体场景选择合适的方法来优化应用程序的性能和数据处理逻辑。

    Hibernate查询 load与get的区别及其它查询测试

    `load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    session的get与load比较

    在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存中获取指定ID对应的实体对象;如果缓存中不存在,则直接执行SQL查询语句从数据库中...

    Hibernate中get()和load()的区别.docx

    在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...

    Hibernate中Session.get()方法和load()方法的详细比较

    Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...

    Hibernate中load方法与get方法的区别

    在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...

    hibernate_reference中文版和Hibernate中文手册

    5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...

    Hibernate方法总结

    以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和 `load`: 这两个方法都是用于从数据库中获取单个对象。`get`方法直接返回一个实体对象,如果数据库中没有找到对应ID的数据,则返回null...

    hibernate中文文档 HTML格式

    例如,使用`save()`或`persist()`方法创建新对象,`load()`或`get()`方法读取对象,`update()`或`merge()`方法更新对象,以及`delete()`方法删除对象。 3. 查询语言(HQL):Hibernate查询语言,类似于SQL,但面向...

    hibernate get/load/saveOrUpdate/statistics

    博文链接:https://log-cd.iteye.com/blog/205166

    Hibernate中文Api最新参考文档

    例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...

    hibernate难点重点笔记

    本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...

Global site tag (gtag.js) - Google Analytics