hibernate session中的load与get

一、get不支持lazy,load支持lazy。

二、采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常。

三、执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。

四、load()方法可以返回实体的代理类实例,而get()永远只返回实体类.

get的例子:

public void testGetMethod() { 
    Session session = null; 
    try { 
      session = HibernateUtils.getSession(); 
      session.beginTransaction(); 
       
      //马上发出查询sql,加载User对象 
      User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2c2ff0002"); 
      System.out.println("user.name=" + user.getName()); 
       
      user.setName("张三"); 
      session.getTransaction().commit(); 
    }catch(Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally { 
      HibernateUtils.closeSession(session); 
    } 
  }

PS:在执行第8行语句的时候,如果数据库有相关的记录,则立刻发出sql语句,即使是没有第9行中user.getName()方法调用,如果没有匹配的记录则返回来一个null。

load方法例子:

public void testLoadMethod() { 
    Session session = null; 
    try { 
      session = HibernateUtils.getSession(); 
      session.beginTransaction(); 
       
      //不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载) 
      //延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句) 
      //hibernate延迟加载实现原理是代理方式 
      User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2b2ff0002"); 
      System.out.println("user.name=" + user.getName()); 
      user.setName("李四"); 
      session.getTransaction().commit(); 
    }catch(Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally { 
      HibernateUtils.closeSession(session); 
    } 
  }

PS:在执行到10句代码的时候并没有立刻发出sql语句,由于load实现了lazy延迟加载,延迟加载只有真正使用该对象的时候才进行加载, 发出sql语句,关键是11句代码。如果load方法里面的id在数据库表里面没有相关的,则会发出ObjectNotFoundException 异常。

PS:可以通过设置断点,用debug来跟踪相关变量跟对象的改变,这样就可以很清晰理解load和get这两个方法。

hibernate,session load出来的对象是

持久态:对象于数据库记录建立对应关系并保持同步。对象被绑定在持久化上下文当中,今后它的任何状态变化、数据变更均处于工作单元的管理之下,这就是持久态。session.load在hibernate3.2中提供的默认延迟加载方式,我觉得load出来的是一个代理,也可以说是持久态(自己这么理解的,如有误请个高手纠正)。

来源: <http://blog.csdn.net/ssyan/article/details/6037645>

时间: 2024-10-14 05:46:16

hibernate session中的load与get的相关文章

Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用. 开启Session Session实例由SessionFactory开启获得,例如: Configuration config = new Configuration().configure(); SessionFact

hibernate架构之session中get与load方法的区别

hibernate是一个用于连接数据库的升级版JDBC,与一般JDBC不同的是,hibernate架构是通过hql进行查找,通过session建立连接.其工作原理是:将实例分为瞬时状态.持久状态.游离状态,通过hql对持久状态的实例进行CRUD.在学习的过程中我们遇到了这样的一个现象:用Session对象调用get()方法和load()方法获取对象时,类似的代码会分为两种结果,get方法运行成功,load方法会报错,代码示例如下: get()方法源代码: Session session= Hib

Hibernate中使用load和get加载的区别

一. Hibernate使用load机制和使用get加载的区别(重点) 1.相同点:get 和load他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例 2. 不同点:如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception. 2.1get 是直接从数据库中检索   而load会使用懒加载(延迟加载)产生一个代理对象,属性oid 2.2 使用load加载,Hibernate会认为该id对应的对象是一定存在的,所

在Hibernate的session中同时有两个相同id的同类型对象,修改失败

若在Hibernate的session中同时有两个相同id的同类型对象,修改会失败,报错:a different object with the same identifier value was already 解决方案: 使用merge() 如下情景: User u = dao.getUser(...) ; User u2 = ... ; u2.setId(u.getId()) ; //此时的session中就有了两个id一样的对象了, dao.update(u2) ; //这里就会报错了,

(21)项目中Hibernate Session的管理方式

1.openSession和getCurrentSession的区别 package com.rk.hibernate.cache; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.Test; public class App_SessionInProject { private static Se

[原理][源代码解析]spring中@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关系---转载

问题: 一. 1. Spring 如何处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSession ? 3. propagation=Propagation.SUPPORTS 和propagation=Propagation.require对生成Session有何影响 ? 共同点:都会进入aspect切面处理, 试图新建Session,开启Transaction ,都能获得.TransactionStatus 区别: 前者成

Session中的方法

Session 管理一个数据库的任务单元,即管理数据库中的增删改查操作,提交事务. 方法CRUD:save(),delete(),load(),get(),update(),saveOrUpdate(),clear().flush() session.beginTransaction(); session.save(Object obj); session.getTransaction().commit(); session.close(); get()与load()的区别 l  查找时,都会优

Entity中Lazy Load的属性序列化JSON时报错

The server encountered an internal error that prevented it from fulfilling this request.org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: com.party.dinner.entit

hibernate session method

import static org.junit.Assert.*; import java.io.FileInputStream; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate