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

Hibernate get()和load() 的区别?

阅读更多

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。load()方法可返回实体的代理类实例,而get方法永远直接返回实体类。

 

gmarwaha在他的blog里, 提到Hibernate get()和load() 的区别, 同时通过例子表明了load() 能带来的性能提升.

考虑如下的一个拍卖应用的例子:

拍卖物件对象: Item

拍卖行为: Bid

Session session = << Get session from SessionFactory >>
Long itemId = << Get the item id from request >>
Item item = (Item) session.get(Item.class, itemId);
if(item != null) {   
Bid bid = new Bid();   
bid.setItem(item);   
session.saveOrUpdate(bid);
} 
else
{   
log.error("Bid placed for an unavailable item");   
// Handle the error condition appropriately
}



这种代码虽然可行,但是有局限性, 可以通过以下方法改进:

Session session = << Get session from SessionFactory >>
Long itemId = << Get the item id from request >>
try{   
Item item = session.load(Item.class, itemId);   
Bid bid = new Bid();   
bid.setItem(item);   
session.saveOrUpdate(bid);
} 
catch(ObjectNotFoundException e) {   
log.error("Bid placed for an unavailable item");   
// Handle the error condition appropriately
}



在这个例子里, 通过load()来查询Item, 如果没有找到, 则会抛出ObjectNotFoundException 而不是返回null,  这使得处理代码更加的优雅.

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load()方法可返回实体的代理类实例,而get方法永远直接返回实体类。
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

而Joseph Ottinger提到: 随着Hibernate完全实现JPA, Hibernate将会通过EntityManager来提供cache, 从而使得这个使用load()的技巧略微无效? 你是如何看待呢?

分享到:
评论

相关推荐

    hibernate get load区别

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

    hibernate中get和load方法的区别

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

    Hibernate的get和load方法的区别

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

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

    标签“hibernate中get和lo”暗示了标签可能被意外截断,但我们可以推断完整标签可能是“hibernate中get和load的区别”。 在实际开发中,选择使用`get`还是`load`取决于具体需求。如果需要立即从数据库中获取对象,...

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

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

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

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

    session的get与load比较

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

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

    首先,让我们关注`get`和`load`的区别: 1. **返回结果对比**: - `load`方法如果找不到对应的记录,会抛出`org.hibernate.ObjectNotFoundException`异常。这是因为`load`方法假设给定的ID肯定在数据库中存在,它...

    hibernate get/load/saveOrUpdate/statistics

    博文链接:https://log-cd.iteye.com/blog/205166

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

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

    How to solve the hibernate N+1 problem?

    8. **使用`Session#load()`代替`Session#get()`**:在已知ID的情况下,`load()`方法不会立即发起数据库查询,而是返回一个代理对象,只有在真正访问属性时才触发查询,但这并不能解决N+1问题,但可以用于优化特定...

    Hibernate 中文api文档

    **Hibernate 框架概述** ...总结,Hibernate中文API文档为开发者提供了详细的操作指南和参考,涵盖了从配置到使用的全过程,帮助理解和掌握Hibernate的各种特性和用法,是学习和使用Hibernate的重要资源。

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

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

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

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

    hibernate难点重点笔记

    《Hibernate难点解析与...理解并灵活运用uuid、get()与load()以及iterator()和list()的区别,是每个Hibernate开发者必备的技能。通过深入学习这些难点,开发者能够更好地驾驭Hibernate,从而提升项目的稳定性和性能。

    2020版Hibernate 12 道.pdf

    8. get()和load()的区别? `get()`方法直接从数据库加载对象,如果对象不存在则返回`null`。而`load()`方法返回一个代理对象,只有在需要对象属性时才会真正加载,支持延迟加载。如果对象不存在,`load()`方法会抛...

    Hiernate里get和load的区别

    在Hibernate框架中,`get` 和 `load` 都是用来从数据库中获取对象的方法,但它们之间存在一些关键差异。了解这些差异对于高效地使用Hibernate至关重要。 首先,让我们来看看这两个方法的基本用法: 1. `get` 方法...

Global site tag (gtag.js) - Google Analytics