`
wang_zhi_peng2007
  • 浏览: 249072 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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();
	}

 

 

分享到:
评论

相关推荐

    hibernate get load区别

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

    Hibernate的get和load方法的区别

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

    session的get与load比较

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

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

    "Hibernate中Session.get()方法和load()方法的详细比较" Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查...

    hibernate和session学习

    `Session`的常用方法包括:`save()`, `update()`, `delete()`, `get()`, `load()`, `query()`等。 1. `save()` 和 `update()`: `save()`用于将新对象持久化到数据库,如果对象已经存在,可以使用`update()`来更新其...

    重写hibernate的session简单增删改查

    在Hibernate中,增加数据通常通过调用Session的save()或saveOrUpdate()方法来实现。save()用于新对象的保存,如果对象已经有了ID,那么它将被更新。saveOrUpdate()会根据对象是否存在数据库中决定是插入还是更新。 ...

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

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

    Hibernate(session管理)

    综上所述,理解和熟练掌握Hibernate中的Session管理对于开发高效、健壮的Java应用程序至关重要。正确地使用Session,结合事务控制、查询语言和缓存策略,可以显著提升数据库操作的效率和应用的整体性能。

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

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

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

    在Hibernate框架中,`get`和`load`都是用于从数据库中检索持久化对象的方法,但它们在工作原理和使用场景上存在着显著的区别。本文将深入探讨这两个方法的差异,并结合实际应用进行详细阐述。 首先,`get`方法是...

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

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

    Hibernate的Session的javadoc

    通过Session的get()或load()方法获取的对象默认处于此状态。 - **游离状态(Detached)**:对象曾经是持久化的,但当前未与任何Session关联。对象在游离状态下可以被重新持久化。 2. **对象持久化操作**: - **...

    hibernate session生命周期示例

    - **加载和检索**:使用`get()`或`load()`方法可以加载一个实体,如果对象存在于数据库,Hibernate将返回一个对应的代理对象。 - **保存和插入**:`save()`方法用于将瞬时对象转换为持久化对象,而`persist()`方法...

    实现自己的Hibernate框架之Session 方法实现

    2. **事务处理**:在Session方法中通常会包裹在一个事务中,以确保数据操作的一致性和完整性。 3. **对象状态管理**:Hibernate需要跟踪对象的状态,如临时态、持久态、游离态,以便决定何时进行保存、更新或删除...

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

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

    04_传智播客hibernate教程_Session接口及getloadpersist方法

    本教程聚焦于Hibernate中的Session接口以及get、load、persist这三个常用的方法,它们是 Hibernate 实现对象-关系映射(ORM)的核心组件。 首先,我们来理解Session接口。Session在Hibernate中扮演着数据库连接的...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    可以使用`get()`或`load()`方法获取单个对象,`query()`或`createCriteria()`方法创建查询,并通过执行查询获取结果集。例如,使用HQL(Hibernate Query Language)查询: ```java Query<MyEntity> query = session...

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

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

    hibernate session详细方法,值得珍藏

    - **`get(Class clazz, Serializable id)`** 和 **`get(String entityName, Serializable id)`**:这些方法与`load()`类似,但它们会在找不到实体时抛出异常,这使得它们在需要强制实体存在的场景下更有用。...

    Hibernate三种状态和Session常用的方法

    get() 和 load() 都是从数据库中获取对象的方法,但是它们之间有一个重要的差别:get() 方法每次执行都会执行查询语句,而 load() 方法则只有在对对象进行操作时才会执行查询语句。 在使用 get() 方法时,每次执行...

Global site tag (gtag.js) - Google Analytics