`
schy_hqh
  • 浏览: 555796 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate基于配置文件(三)get()与load()的区别

 
阅读更多

首先,Hibernate默认开启懒加载策略!是Hibernate推崇的一种提高性能的方法!

 

get()与load()都用于加载已存在id值的对象到内存中

区别:

get()

get()马上发出SQL语句查询相关对象

get()操作的对象如果不存在,抛NullPointerException

get()返回的是原始对象

 

load()

load()使用Hibernate的懒加载策略,除非调用到对象的非id属性,否则不会发出查询语句

load()加载的对象如果不存在,抛ObjectNotFountException

load()返回的是1个代理对象

如果懒加载策略被取消(lazy=false),则load()会立即发出SQL查询语句,而且不再返回代理对象

 

懒加载---重点

1. 实体类一定要有无参构造方法!
2. 任何一个实体类都必须有唯一的数据库标识值(逻辑主键,不要用业务主键)
3. 数据库标识不允许修改---所以不能将业务属性定义为主键
4. 主键-非空、唯一
5. 懒加载只有在使用load()的前提下,且lazy=true,且session未关闭前才会生效
6. 如果session已经关闭,使用懒加载机制会发生异常:LazyInitializationException: could not initialize proxy - no Session
7. get()与懒加载机制无关,即使lazy=true,懒加载也不会生效
8. 懒加载实现原理---代理对象
9. *只要调用user中除了getId()之外的其他任何方法(只要是在User类中定义的方法,包括从Object中继承的toString()),
    hibernate就认为使用到了对象的非id属性,这是就会立即发出select语句从数据库获取对象属性!
    注意:即使是调用setId()都会促发hibernate发出select查询!但是,一般都不使用setId(),因为:修改主键值是什么行为呢?

10. 延迟加载的好处:只需要加载到对象,而不需要对象的属性,使用懒加载机制就能避免发出select查询语句,这样提高了程序执行效率!!!
    关联映射时,就用load(),不用hibernate发出查询语句!
    
11. 延迟发出:
        hibernate的性能调整方案!
        比如:insert\delete 语句在commit之后才被发出(一批数据与数据库进行通信)--这就是延迟,这就是性能调整!
        建议多用load(),充分利用hibernate的性能调整!
12. get时,如果对象不存在,主键id不存在,在get时会马上抛空指针异常
    load时,对象不存在,会延迟到真正加载对象(发出select语句时)才会抛异常,即异常被延迟抛出,因为前面还没有访问数据库,怎么抛异常呢!
13. 如果lazy=false,则不会有代理对象!

 

 

 

package org.leadfar.hibernate.model;

import java.util.Date;

import junit.framework.TestCase;

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

public class UserTest04 extends TestCase {
	
	//session未关闭,lazy=true,使用load()懒加载机制生效。
	//直到真正使用到对象非id属性时才会发出select语句
	//或者说调用了User类中非getId()的任何方法,hibernate就会发出select语句
	//注意:调用setId()也会促使hibernate发出select语句,但是修改主键为其它值,则会发生异常!
	public void testUser_Lazy01() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		
		try {
			//开启事务
			session.beginTransaction();
			
			//使用load方法获取对象属性,当lazy="true"时,访问id属性是不会发出select语句的
			//因为id作为主键,在load方法中已经指明了,所以hibernate不用访问数据库就能直到id值是多少
			User user =(User)session.load(User.class, 109);
			
			System.out.println(user.getId());
			System.out.println(user.getName());
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
	
	//session未关闭,lazy=false,懒加载不会生效
	public void testUser_Lazy02() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		
		try {
			//开启事务
			session.beginTransaction();
			
			//使用load方法获取对象属性,当lazy="false"时,hibernate会马上发出select语句,即不会延迟加载
			//相当于使用get()方法没有延迟加载机制
			//使用get()即使lazy=true,懒加载机制也不会生效。
			//懒加载只有在使用load的前提下,且lazy=true才会生效
			User user =(User)session.load(User.class, 109);
			
			System.out.println(user.getId());
			System.out.println(user.getName());
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
	
	//使用懒加载机制,在session关闭之后,访问对象属性,会发生LazyInitializationException异常
	//session关闭之后才真正访问到对象非id属性时,这时再加载就会发生异常!
	//该异常发生的前提:1.lazy=true 2.session有效期间没有发出select语句
	//3,在session关闭后,才需要hibernate发出select语句,但是此时session已经关闭,所以异常发生了!
	public void testUser_Lazy03() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		User user = null;
		try {
			//开启事务
			session.beginTransaction();
			
			//使用load方法获取对象属性,当lazy="false"时,hibernate会马上发出select语句,即不会延迟加载
			//相当于使用get()方法没有延迟加载机制
			//使用get()即使lazy=true,懒加载机制也不会生效。
			//懒加载只有在使用load的前提下,且lazy=true,且session未关闭前才会生效
			user =(User)session.load(User.class, 109);

			System.out.println(user.getId());

			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
		//session关闭之后,懒加载失效
		System.out.println(user.getName());
		System.out.println(user.getBirthday());
		//org.hibernate.LazyInitializationException: could not initialize proxy - no Session
		
	}
	
	
	//加载对象的时候不能使用setId()方法改变对象的id主键值,否则引发异常
	//当然,使用setId()修改为同一个值不会引发异常,会促发hibernate发出select语句!
	public void testUser_Lazy04() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		User user = null;
		try {
			//开启事务
			session.beginTransaction();
			
			//加载对象时,修改了id主键,commit的时候会报异常
			user =(User)session.load(User.class, 109);
			
			System.out.println(user.getId());
			user.setId(110);//setId()方法会促发hibernate发出select语句!!!!!
			//user.setId(110);--->引发异常,主键值被修改了
			//注意:setId()调用会不论异常发生与否,hibernate都会发出select语句查询数据库并通过setX()设置对象属性
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
		//即使调用setId()引发了异常,下面一样可以访问到对象属性值
		//同时,发生异常的话,下面获取到的id值一定是新值
		//如果还是以前的值,那么修改的id值就是同一个值,即没有发生异常!!!
		System.out.println(user.getId());
		System.out.println(user.getName());
		System.out.println(user.getMoney());
	}
	
	//get()加载对象,如果对象不存在时,即使没有使用到对象的非id属性,也会抛异常
	//因为一旦get,就会发出select语句
	public void testUser_Lazy05() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		User user = null;
		try {
			//开启事务
			session.beginTransaction();
			
			//加载对象时,主键不存在,执行到下一句时,异常抛出
			user =(User)session.get(User.class, 200);
			System.out.println(user.getMoney());
			System.out.println(user.getId());
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
	
	
	//load()加载对象,如果对象不存在时,又没有使用到对象的其他非id属性,不会发生异常
	//因为没有发出select语句查询数据库,所以不会有异常发生
	//如果使用到了其他属性,则异常会延迟到真正发select语句后才会抛出!
	public void testUser_Lazy06() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		User user = null;
		try {
			//开启事务
			session.beginTransaction();
			
			//加载对象时,修改了id主键,commit的时候会报异常
			user =(User)session.load(User.class, 200);
		
			System.out.println(user.getId());
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
}

 

分享到:
评论

相关推荐

    hibernateJar包及配置文件

    2. Hibernate配置文件(hibernate.cfg.xml): - 数据库连接配置:包括数据库URL、用户名、密码、驱动类名等,这些信息定义了应用程序如何连接到数据库。 - 映射文件引用:通过`<mapping resource=""/>`标签,指定...

    Eclipse Hibernate基本配置及简单实现

    4. **Hibernate配置文件(hibernate.cfg.xml)**: 创建该文件并配置数据库连接信息,包括driver_class、url、username、password等属性。 ```xml <hibernate-configuration> <property name="hibernate.dialect...

    hibernate相关配置.rar

    - **SessionFactory**:基于配置文件创建,是线程安全的,整个应用只需要一个SessionFactory实例。 - **Session**:每次数据库操作应使用SessionFactory创建Session,它是短生命周期的,每个数据库操作(比如查询...

    hibernate5.3框架环境配置成功代码

    以上就是关于Hibernate 5.3框架环境配置的基本知识点,具体代码示例可能包括数据库连接、实体类创建、配置文件编写、会话工厂和会话的使用等。在实际开发中,你还可以结合日志框架、AOP(面向切面编程)等工具进一步...

    hibernate的配置视频 讲解非常详细

    在配置文件中,还会涉及到SessionFactory的设置,它是Hibernate的核心组件,负责管理Session对象。Session是与数据库交互的主要接口,用于执行CRUD操作(创建、读取、更新和删除)。在视频中,讲师会详细解释...

    spring4.2与Hibernate4.3配置

    3. **配置Spring**:在Spring的配置文件(如applicationContext.xml)中,声明DataSource,这是数据库连接池的Bean。接着,配置SessionFactory Bean,注入DataSource,并设置Hibernate的相关属性。 4. **配置...

    基于struts和hibernate的学生信息管理系统

    Hibernate配置文件(hibernate.cfg.xml)包含了数据库连接信息,实体类通过注解或XML映射文件与数据库表关联。 **学生信息管理系统的实现**: 1. **数据库设计**:通常会有一个"Student"表,包含学生的ID、姓名、...

    hibernate配置例子

    **hibernate配置例子** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本配置例子旨在帮助初学者理解如何在项目中设置和使用Hibernate。在这个例子中,我们并不会...

    hibernate常用包(包含数据库)

    - `hibernate.cfg.xml`: Hibernate的主要配置文件,定义了数据库连接信息、方言、缓存策略等。开发者需要在此处指定数据库驱动、连接URL和其他相关参数。 5. **实体类(Entity)**: - 开发者会创建一系列的Java...

    hibernate原理与配置快速入门

    - **hibernate.cfg.xml**:这是Hibernate的主配置文件,包含了数据库连接信息、缓存设置等核心配置。 - **实体类与映射文件**:每个持久化类都需要一个对应的.hbm.xml文件,定义类与数据库表的映射关系。 ### 4. ...

    Hibernate配置文.pdf

    在数据加载时,`Session.load()`和`Session.get()`方法有细微差别:`load()`在找不到匹配对象时会抛出异常,而`get()`则返回null,不会打印错误信息。 4. **XML配置文件(hibernate.cfg.xml)** 另一种配置方式是...

    hibernate完整的一个项目

    它是Hibernate启动时加载的第一个配置文件。 2. **实体类的XML映射文件**: 对应数据库表的Java类,每个类通常有一个对应的`.hbm.xml`文件,用于描述类与表之间的映射关系。 样例代码通常包括以下部分: 1. **...

    hibernate入门配置

    - **Read**:使用`get()`或`load()`根据主键查询,`query()`进行HQL(Hibernate Query Language)查询。 - **Update**:调用`update()`更新对象状态。 - **Delete**:调用`delete()`删除对象。 **六、...

    Hibernate自动生成持久化类和映射文件

    "Hibernate自动生成持久化类和映射文件"这个话题主要涉及如何利用myEclipse这款集成开发环境的反向工程功能,快速地根据数据库中的表结构生成对应的Hibernate配置文件、映射文件以及持久化类。下面将详细介绍这一...

    Hibernate内容大纲答案

    - 然后,通过`Configuration`类加载配置文件并创建一个`SessionFactory`实例,这是Hibernate的核心,用于创建Session。 - 创建`Session`实例,它是与数据库交互的单线程工作单元,类似于JDBC中的Connection。 - ...

    hibernate源代码的zip文件

    本文将基于“hibernate源代码的zip文件”展开,深入探讨Hibernate的核心原理与源码实现。 一、Hibernate概述 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得Java...

    Java Hibernate3 添加和删除数据

    2. **创建SessionFactory**:基于配置文件,我们创建SessionFactory对象。SessionFactory是一个重量级对象,负责管理Session的生命周期。它是线程安全的,因此在整个应用程序中只需要一个实例。 3. **打开Session**...

    Hibernate3框架系列 [ 1 ]

    文件“hibernateCfg”可能是一个示例的Hibernate配置文件,它包含了数据库连接信息(如URL、用户名、密码)、JDBC驱动、缓存配置等。这个文件是配置Hibernate3的基础,我们需要根据实际的数据库环境进行相应的修改。...

    hibernate配置

    【hibernate配置】是Java开发中非常关键的一环,它是使用Hibernate ORM框架与数据库进行交互的基础。Hibernate是一个强大的对象关系映射(ORM)工具,它允许开发者将业务逻辑与数据库操作解耦,通过面向对象的方式...

Global site tag (gtag.js) - Google Analytics