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得到的也是代理对象。
相关推荐
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存中获取指定ID对应的实体对象;如果缓存中不存在,则直接执行SQL查询语句从数据库中...
3. `get()` 和 `load()`: `get()`根据主键获取对象,如果对象不存在,返回null;`load()`同样用于获取对象,但如果对象不存在,会抛出异常。`load()`在延迟加载机制中更为常用。 4. `query()`: 通过HQL(Hibernate ...
可以使用`get()`或`load()`方法获取单个对象,`query()`或`createCriteria()`方法创建查询,并通过执行查询获取结果集。例如,使用HQL(Hibernate Query Language)查询: ```java Query<MyEntity> query = session...
通过Session的get()或load()方法获取的对象默认处于此状态。 - **游离状态(Detached)**:对象曾经是持久化的,但当前未与任何Session关联。对象在游离状态下可以被重新持久化。 2. **对象持久化操作**: - **...
在数据加载时,`Session.load()`和`Session.get()`方法有细微差别:`load()`在找不到匹配对象时会抛出异常,而`get()`则返回null,不会打印错误信息。 4. **XML配置文件(hibernate.cfg.xml)** 另一种配置方式是...
4. **检索(Load/Get)**:`Session.load()`根据标识符加载对象,而`Session.get()`则可能返回null,如果对象不存在。 五、懒加载与级联操作 1. **懒加载(Lazy Loading)**:默认情况下,关联的对象不会立即加载,...
- **读取(Read)**:使用`Session.get()`或`Session.load()`根据主键获取实体,或使用`Session.createQuery()`或`Session.createCriteria()`执行HQL(Hibernate查询语言)查询。 - **更新(Update)**:修改实体后...
### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
在实际项目中,通常会结合Spring框架来管理Hibernate的SessionFactory和Session。通过Spring的`LocalSessionFactoryBean`和`HibernateTemplate`,可以实现更方便的事务管理和数据库操作。 总结,Hibernate作为强大...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
- **读取**:`session.get()`或`session.load()`用于根据主键获取对象。 - **更新**:修改对象状态后,调用`session.update()`。 - **删除**:调用`session.delete()`。 例如,一个简单的保存操作可能如下所示: `...
在这个“hibernate code.rar”压缩包中,我们很可能会找到关于Hibernate的视频教程——"hibernate介绍与动手入门体验.avi",这个资源将引导我们深入了解Hibernate的核心概念和实际应用。 首先,让我们谈谈Hibernate...
- **查询**:使用Session的`load()`或`get()`方法获取对象,`createCriteria()`或`createQuery()`构建复杂查询。 - **删除**:通过Session的`delete()`方法。 - **更新**:`update()`方法。 - **保存**:`save()`或`...
"重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...
在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...
在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
### 在Hibernate中的数据库操作 ...特别地,`save`、`get`、`load` 和 `delete` 方法是进行基本 CRUD 操作的基础,而理解它们之间的差异能够帮助开发人员更高效地利用 Hibernate 来处理数据库交互。