- 浏览: 231878 次
- 性别:
- 来自: beijing
-
文章分类
在hibernate 3.0 以后 find方法变成不推荐的使用方法
使用find方法的时候 返回类型是list ,采用hql 语句的方式的时候不要用强制转换,用 session,createQuery("hql").list();
get 与load方法 区别很简单
对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据 库中没有就返回null。这个相对比较简单,也没有太大的争议。
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。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ycyangcai/archive/2010/04/05/5452069.aspx
发表评论
-
二进制 授权管理 java
2013-09-09 12:52 919package org.qincy.binary; ... -
com.richfit.bi.quartz 定时执行示例
2013-04-12 15:39 01 内含jetty 配置,下载jetty 依赖包,算了,还是提 ... -
利用工具将shp文件导入到oracle spatial中
2012-05-21 14:20 44031 下载shp2sdo 工具,将工具放在 oracle按照目录 ... -
Arcgis object for java 访问栅格数据,使用GP工具,进行栅格矢量化---栅格矢量化面。
2012-06-20 09:17 4187直接贴代码了,不多解释了。 1、栅格数据的 ... -
svn 删除注册表
2012-02-11 12:02 1591svn 删除注册表 -
arcgis server 服务
2012-01-06 17:58 1196package com.hdmap.fymas; imp ... -
Flex BlazeDS java 项目
2011-12-12 17:21 1116根据网上的例子 ,写的 flex BlazeDS 框架与 ... -
工具类
2011-02-18 14:05 985英文数字转换为 中文数字 public class Mon ... -
junit 4 spring 自动化测试
2010-12-13 16:08 16531 添加jar ,依赖jar 包围 spring-test, ... -
在tomcat 发布,去掉项目名称
2010-11-17 09:53 19841 找到 server.xml 配置= ... -
掉字段内容包含的空格
2010-09-27 10:17 990使用replace函数去掉字段内容包含的空格,例子如下: up ... -
无聊的jsti 的fn 函数(资料备份)
2010-09-25 17:16 992无聊的jsti 的fn 函数(资料备份) ... -
无聊写Code
2010-09-25 09:38 1015package edu.qdkj.main; impor ... -
Spring Quartz 学习
2010-09-20 09:27 1183Quartz 是一个 定时执行的框架,可以设定规定时执行,或者 ... -
kaptcha 例子
2010-09-13 15:09 3037kaptcha 简单例子 与 产生中文字符 kaptch ... -
myEclipse 下的项目不能编译
2010-09-09 14:21 958查看 是否有的错误的jar 1.项目----prope ... -
关于VLSM 例子
2010-08-31 16:57 1509未经测试,不知道理解是否正确。 VLSM(可变长子网掩码) ... -
jwebmail的配置
2010-08-16 16:59 2512jwebmail的配置说明 ... -
Solaris10下Nagios安装
2010-08-16 08:48 985发 -
java JDK 下载页面
2010-08-13 16:32 1037全部JDK 下载,从 1.1 到 jdk 6 下载 http ...
相关推荐
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
- `get`方法和`find`方法的行为相似,它们都会直接从数据库中检索数据。 - `load`方法的执行则更为复杂,它首先检查Session的持久化上下文(persistent Context)中是否存在缓存,如果有则直接返回。如果不存在且...
在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...
- 编写业务逻辑:调用HibernateTemplate提供的方法,如`save()`, `update()`, `delete()`, `get()`, `load()`, `execute()`等,进行数据库操作。 6. **优点与局限性**: HibernateTemplate简化了代码,提供了事务...
本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...
与`get`方法类似,但`load`方法会在找不到对应实体时抛出异常。 3. **全表查询** ```java Query query = session.createQuery("from Order"); List<Order> list = query.list(); ``` 此方法用于查询表中的...
get()方法直接返回对象,而load()则返回一个代理对象,只有在需要时才从数据库加载数据,以实现懒加载。 5. **查询(createQuery()、createSQLQuery()、find()等)**:Hibernate提供丰富的查询方式,如HQL...
3. 加载与检索:`get()`和`load()`用于根据ID加载对象,`find()`和`list()`支持基于HQL或Criteria的查询。 五、缓存机制 Hibernate提供了一级缓存(Session级别)和二级缓存(SessionFactory级别),有效减少了...
8. **对象获取方法**:`get()`、`load()`和`find()`用于获取指定ID的对象。`get()`和`load()`首先查找缓存,`find()`始终查询数据库。`get()`和`load()`效率相对较高,但`load()`不立即执行SQL,可能导致延迟加载...
注意,如果在不同Session中更新对象,你需要先调用`session.load()`或`session.get()`来重新获取对象,因为Session之间的对象是隔离的。此外,如果对象在Session之外被更新,那么在更新之前需要调用`session.update...
6. **实体转换**:将数据库查询结果转化为对应的Java对象,通常是通过`Session.load()`或`Session.get()`方法,或者通过`Query.list()`获取集合后再进行转换。 7. **异常处理**:封装Hibernate和JDBC抛出的异常,...
2. 读取(Read):`get()`和`load()`用于根据主键获取对象,`find()`和`query()`则支持更复杂的查询。 3. 更新(Update):`update()`方法更新已存在的对象。 4. 删除(Delete):`delete()`方法删除对象。 七、HQL...
2. 使用find(), get(), load()或iterator()等查询方法获取的对象直接成为持久对象。 3. 持久对象在Session关闭后变为脱管对象,或者通过clear(), evict()方法主动从Session中移除。 4. 脱管对象可以被Session的merge...
4. 加载和检索:get()和load()加载单个对象,find()和query()用于执行HQL或Criteria查询。 六、级联操作 通过设置属性 cascade,可以控制实体间的操作是否级联,例如级联保存、更新、删除等。 七、缓存机制 ...
3. **Session接口**:作为与数据库交互的主要接口,Session包含了增删改查(CRUD)的基本操作,如save()、update()、delete()、get()、load()、find()等,以及事务管理相关的方法。 4. **Query和Criteria查询**:...
- get()和load():根据主键获取对象,load()会延迟加载。 - find():通过HQL或Criteria API执行查询。 5. Hibernate缓存机制: - 第一级缓存:SessionFactory级别的,每个Session都有自己的缓存,存储当前...
这些方法的实现通常会委托给Hibernate的Session对象,例如`Session.get()`, `Session.load()`, `Session.save()`, `Session.update()`等。在实际项目中,需要在具体实现类中注入SessionFactory或Session,然后调用...
**临时状态(Transient) -> 持久化状态(Persistent)**:通过调用Session的`get()`, `load()`, `find()`, `iterate()`等方法,可以直接将新创建的对象绑定到数据库中的记录,从而使其进入持久化状态。 **游离状态...
1. **仅限特定方法:**延迟加载仅适用于`load`, `get`, `find`等方法,不适用于HQL等直接编写SQL的方式。 2. **调试考虑:**在调试时,如果使用了延迟加载,要注意查看代理对象的实际类型,以确保正确理解其行为。 3...
5. **查询和结果集处理**:提供了丰富的查询方法,如`find()`, `load()`, `get()`等,以及方便的结果集转换和分页功能。 6. **Callback机制**:通过HibernateCallback接口,可以在Hibernate Session内部执行自定义...