`
hejiajunsh
  • 浏览: 409970 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

hibernate get 与load 与find 方法

阅读更多

第一篇

       这次我们来谈一下Hibernate3.2 Session加载数据时get和load方法的区别(Hibernate 3以后的版本就用get()方法取代find()这个方法了),其实这个在网上有很多的论述,可大多语焉不详或经不起实践的推敲,让很多初学者学的满腹疑 窦,现在我给大家讲解一下:

1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据 库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!

2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:

(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为 实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一 个ObjectNotFoundException。

(2)若为false,就跟Hibernate get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

 

这里get和load有两个重要区别:

 

       如果未能发现符合条件的记录,Hibernate get方法返回null,而load方法会抛出一个ObjectNotFoundException。 
       load 方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远 只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用 过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数 据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。) 
       总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

 

第二篇

 

Users user = (Users)session.load(Users.class, userId);    

 

get加载方法:

Users user = (Users)session.get(Users.class, userId);  

 

 

两加载方法区别:

区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

也就是说: 而:
 

Users user = (Users)session.load(Users.class, userId);  

 

这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

 

Users user = (Users)session.get(Users.class, userId);  

 

则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

注意:
 

Users user = (Users)session.load(Users.class, userId);  

System.out.println(user.getId());  

 

上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

分享到:
评论

相关推荐

    Hibernate的get和load方法的区别

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

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

    - `get`方法和`find`方法的行为相似,它们都会直接从数据库中检索数据。 - `load`方法的执行则更为复杂,它首先检查Session的持久化上下文(persistent Context)中是否存在缓存,如果有则直接返回。如果不存在且...

    Hibernate方法总结

    在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...

    Spring_Spring_Hibernate_HibernateTemplate

    - 编写业务逻辑:调用HibernateTemplate提供的方法,如`save()`, `update()`, `delete()`, `get()`, `load()`, `execute()`等,进行数据库操作。 6. **优点与局限性**: HibernateTemplate简化了代码,提供了事务...

    Hibernate查询解决方案

    本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...

    Hibernate的Template方法以及SQL简介

    与`get`方法类似,但`load`方法会在找不到对应实体时抛出异常。 3. **全表查询** ```java Query query = session.createQuery("from Order"); List<Order> list = query.list(); ``` 此方法用于查询表中的...

    实现自己的Hibernate框架之Session 方法实现

    get()方法直接返回对象,而load()则返回一个代理对象,只有在需要时才从数据库加载数据,以实现懒加载。 5. **查询(createQuery()、createSQLQuery()、find()等)**:Hibernate提供丰富的查询方式,如HQL...

    hibernate 3.2.2

    3. 加载与检索:`get()`和`load()`用于根据ID加载对象,`find()`和`list()`支持基于HQL或Criteria的查询。 五、缓存机制 Hibernate提供了一级缓存(Session级别)和二级缓存(SessionFactory级别),有效减少了...

    Hibernate 面试题

    8. **对象获取方法**:`get()`、`load()`和`find()`用于获取指定ID的对象。`get()`和`load()`首先查找缓存,`find()`始终查询数据库。`get()`和`load()`效率相对较高,但`load()`不立即执行SQL,可能导致延迟加载...

    hibernate更新操作

    注意,如果在不同Session中更新对象,你需要先调用`session.load()`或`session.get()`来重新获取对象,因为Session之间的对象是隔离的。此外,如果对象在Session之外被更新,那么在更新之前需要调用`session.update...

    Hibernate 原生通用DAO

    6. **实体转换**:将数据库查询结果转化为对应的Java对象,通常是通过`Session.load()`或`Session.get()`方法,或者通过`Query.list()`获取集合后再进行转换。 7. **异常处理**:封装Hibernate和JDBC抛出的异常,...

    hibernate基础技术

    2. 读取(Read):`get()`和`load()`用于根据主键获取对象,`find()`和`query()`则支持更复杂的查询。 3. 更新(Update):`update()`方法更新已存在的对象。 4. 删除(Delete):`delete()`方法删除对象。 七、HQL...

    Hibernate三种状态

    2. 使用find(), get(), load()或iterator()等查询方法获取的对象直接成为持久对象。 3. 持久对象在Session关闭后变为脱管对象,或者通过clear(), evict()方法主动从Session中移除。 4. 脱管对象可以被Session的merge...

    hibernate-release-5.2.10

    4. 加载和检索:get()和load()加载单个对象,find()和query()用于执行HQL或Criteria查询。 六、级联操作 通过设置属性 cascade,可以控制实体间的操作是否级联,例如级联保存、更新、删除等。 七、缓存机制 ...

    Hibernate参考文档(CHM).

    3. **Session接口**:作为与数据库交互的主要接口,Session包含了增删改查(CRUD)的基本操作,如save()、update()、delete()、get()、load()、find()等,以及事务管理相关的方法。 4. **Query和Criteria查询**:...

    精通hibernate源码ch2

    - get()和load():根据主键获取对象,load()会延迟加载。 - find():通过HQL或Criteria API执行查询。 5. Hibernate缓存机制: - 第一级缓存:SessionFactory级别的,每个Session都有自己的缓存,存储当前...

    Hibernate泛型DAO及使用方法借鉴.pdf

    这些方法的实现通常会委托给Hibernate的Session对象,例如`Session.get()`, `Session.load()`, `Session.save()`, `Session.update()`等。在实际项目中,需要在具体实现类中注入SessionFactory或Session,然后调用...

    Hibernate中的实体状态及转换

    **临时状态(Transient) -> 持久化状态(Persistent)**:通过调用Session的`get()`, `load()`, `find()`, `iterate()`等方法,可以直接将新创建的对象绑定到数据库中的记录,从而使其进入持久化状态。 **游离状态...

    hibernate延迟加载解决

    1. **仅限特定方法:**延迟加载仅适用于`load`, `get`, `find`等方法,不适用于HQL等直接编写SQL的方式。 2. **调试考虑:**在调试时,如果使用了延迟加载,要注意查看代理对象的实际类型,以确保正确理解其行为。 3...

    对hibernate的封装 HibernateTemplate

    5. **查询和结果集处理**:提供了丰富的查询方法,如`find()`, `load()`, `get()`等,以及方便的结果集转换和分页功能。 6. **Callback机制**:通过HibernateCallback接口,可以在Hibernate Session内部执行自定义...

Global site tag (gtag.js) - Google Analytics