`
liujiawinds
  • 浏览: 137073 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

 
阅读更多
session.get session.load

 

1.没有符合条件的记录会返回null

2.不支持Lazy

3.查找顺序为:

一级缓存---->二级缓存---->数据库(返回的是实体对象)

1.没有符合条件的记录会报ObjectNotFoundException

2.支持Lazy

3.查询数据的顺序:一级缓存---(没有找到)-->代理对象--用到数据时(如user.getUserName())-->二级缓存--->数据库(返回的是代理对象)

 

 

为验证以上说法,写了一个测试:

public class TestHelloWorld {
	private SessionFactory sessionFactory;
	private ClassPathXmlApplicationContext context;
	private Session session;
	
	@Before
	public void before(){
		context= new ClassPathXmlApplicationContext("applicationContext.xml");
		sessionFactory = (SessionFactory) context.getBean("sessionFactory");
		session = sessionFactory.openSession();
		
	}
	
	@Test
	public void testGetLoad(){
                //User user1=(User) session.get(User.class, 1);实体对象
                //User user2=(User) session.load(User.class, 1); 实体对象,因为它会先从一级缓存中找,如果没找到才会创建代理对象
		User user = (User) session.load(User.class, 1);//返回代理对象
                User user1=(User) session.get(User.class, 1);//代理对象
		Message message = (Message) session.get(Message.class, 1);//返回实体对象
		String p = user.getPassword();//在这一行设置断点可以看到两个对象的不同之处。
        //        User user = (User) session.load(User.class, 1);//返回代理对象
	//	String p = user.getPassword();//初始化代理对象
	//	User user1=(User) session.get(User.class, 1);//返回的也是代理对象
	}
}

 user对象是一个代理对象,里面有两个属性,initialized跟target,在运行String p = user.getPassword();这一句之前,initialized为false,target为null。target就是user这个代理对象所对应的的实体对象。

message对象是一个实体对象。

在运行那一句之后,user对象里面的两个属性值也改变,initialized变成了true,target是一个User类型的实体对象。

 

 

上面代码里有三种情况:

 

1.如果先有get过,在一级缓存中也就有这个对象,load也会得到一个实体对象。

 

2.先load后get,load得到的是代理对象,get得到的是实体对象。

 

3.先load,初始化之后再去get,get得到的也是代理对象。

 

 

0
0
分享到:
评论

相关推荐

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

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

    session的get与load比较

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

    hibernate和session学习

    3. `get()` 和 `load()`: `get()`根据主键获取对象,如果对象不存在,返回null;`load()`同样用于获取对象,但如果对象不存在,会抛出异常。`load()`在延迟加载机制中更为常用。 4. `query()`: 通过HQL(Hibernate ...

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

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

    Hibernate的Session的javadoc

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

    Hibernate配置文.pdf

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

    hibernate-3.6.8.Final

    4. **检索(Load/Get)**:`Session.load()`根据标识符加载对象,而`Session.get()`则可能返回null,如果对象不存在。 五、懒加载与级联操作 1. **懒加载(Lazy Loading)**:默认情况下,关联的对象不会立即加载,...

    SSH应用开发-Hibernate应用入门.zip_hibernate

    - **读取(Read)**:使用`Session.get()`或`Session.load()`根据主键获取实体,或使用`Session.createQuery()`或`Session.createCriteria()`执行HQL(Hibernate查询语言)查询。 - **更新(Update)**:修改实体后...

    hibernate get load区别

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

    Hibernate入门示例.doc

    在实际项目中,通常会结合Spring框架来管理Hibernate的SessionFactory和Session。通过Spring的`LocalSessionFactoryBean`和`HibernateTemplate`,可以实现更方便的事务管理和数据库操作。 总结,Hibernate作为强大...

    Hibernate的get和load方法的区别

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

    Hibernate 入门操作.ppt

    - **读取**:`session.get()`或`session.load()`用于根据主键获取对象。 - **更新**:修改对象状态后,调用`session.update()`。 - **删除**:调用`session.delete()`。 例如,一个简单的保存操作可能如下所示: `...

    hibernate code.rar

    在这个“hibernate code.rar”压缩包中,我们很可能会找到关于Hibernate的视频教程——"hibernate介绍与动手入门体验.avi",这个资源将引导我们深入了解Hibernate的核心概念和实际应用。 首先,让我们谈谈Hibernate...

    hibernate课程笔记.doc

    - **查询**:使用Session的`load()`或`get()`方法获取对象,`createCriteria()`或`createQuery()`构建复杂查询。 - **删除**:通过Session的`delete()`方法。 - **更新**:`update()`方法。 - **保存**:`save()`或`...

    重写hibernate的session简单增删改查

    "重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...

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

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

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

    在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...

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

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

    在hibernate中的数据库操作

    ### 在Hibernate中的数据库操作 ...特别地,`save`、`get`、`load` 和 `delete` 方法是进行基本 CRUD 操作的基础,而理解它们之间的差异能够帮助开发人员更高效地利用 Hibernate 来处理数据库交互。

Global site tag (gtag.js) - Google Analytics