session.get 与 session.load区别
1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。
2. load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:
(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否 存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候, 再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
(2)若为false,就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
这里get和load有两个重要区别:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)
以下是代码实例:
Category.hbm.xml:
<hibernate-mapping package="cn.itcast.bbs.entities">
<class name="Category" table="itcast_category" lazy="false" ><<<<<<<<<<<<<<1.
<id name="id" >
<column name="ID_" unique="true"></column>
<generator class="native"></generator>
</id>
<property name="name" column="NAME_"></property>
<property name="desc" column="DESC_"></property>
<property name="order" column="ORDER_"></property>
<set name="forums" order-by="ORDER_ ASC" lazy="true" ><<<<<<<<<<<<<<<<2.
<key column="CATEGORY_"></key>
<one-to-many class="Forum" />
</set>
</class>
</hibernate-mapping>
DaoImpl:
public Category get(int id) {
return (Category) getSession().get(Category.clazz, id);
}
public T load(int id) {
return Category) getSession().load(Category.clazz, id);
}
1.情况如下时
junit:
private CategoryDao categoryDao = new CategoryDaoImpl();
public void testGet(){
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Category c = categoryDao.load(2);
//System.out.println(c.getId() + ", " + c.getName());<<<<<<<3.
//System.out.println( c.getForums());<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4.
session.getTransaction().commit();
session.close();
}
a. 1.lazy="false" 2.lazy="true" 时:
Console:
Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?
打开注释3时
Console:
Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?
2, b
打开注释4时
Console:
Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?
2, b
Hibernate: select forums0_.CATEGORY_ as CATEGORY5_1_, forums0_.ID_ as ID1_1_, forums0_.ID_ as ID1_1_0_, forums0_.NAME_ as NAME2_1_0_, forums0_.DESC_ as DESC3_1_0_, forums0_.ORDER_ as ORDER4_1_0_, forums0_.CATEGORY_ as CATEGORY5_1_0_ from itcast_forum forums0_ where forums0_.CATEGORY_=? order by forums0_.ORDER_ ASC
[id=2,name=b1,order=2, id=3,name=b2,order=3]
b. 1.lazy="true" 2.lazy="true" 时:
Console:
打开注释3时
Console:
Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?
2, b
打开注释4时
Console:
Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?
2, b
Hibernate: select forums0_.CATEGORY_ as CATEGORY5_1_, forums0_.ID_ as ID1_1_, forums0_.ID_ as ID1_1_0_, forums0_.NAME_ as NAME2_1_0_, forums0_.DESC_ as DESC3_1_0_, forums0_.ORDER_ as ORDER4_1_0_, forums0_.CATEGORY_ as CATEGORY5_1_0_ from itcast_forum forums0_ where forums0_.CATEGORY_=? order by forums0_.ORDER_ ASC
[id=2,name=b1,order=2, id=3,name=b2,order=3]
更多示例,请大家自行测试,这里就不赘述了
分享到:
相关推荐
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
标签“hibernate中get和lo”暗示了标签可能被意外截断,但我们可以推断完整标签可能是“hibernate中get和load的区别”。 在实际开发中,选择使用`get`还是`load`取决于具体需求。如果需要立即从数据库中获取对象,...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...
- 在进行Hibernate查询测试时,应确保数据库连接配置正确,实体类与表结构对应,并在测试代码中模拟不同场景,如正常加载、延迟加载、不存在的实体等,以全面验证`load`和`get`的行为。 - 对于`query`和`criteria`...
本文将深入探讨`get`与`load`两种方法的区别及其应用场景。 #### 一、基本概念 在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存...
在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...
在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
博文链接:https://log-cd.iteye.com/blog/205166
本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...
例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...
例如,使用`save()`或`persist()`方法创建新对象,`load()`或`get()`方法读取对象,`update()`或`merge()`方法更新对象,以及`delete()`方法删除对象。 3. 查询语言(HQL):Hibernate查询语言,类似于SQL,但面向...
Hibernate允许开发人员在Java应用程序中使用面向对象的方式操作数据库,消除了传统的JDBC代码与SQL之间的繁琐对接。在这个文档中,我们将深入探讨其核心概念、配置、实体管理以及查询语言等方面。 首先,文档会讲解...
5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...