Hibernate的get和load方法都是用于查询一条记录,但是他们又很大的区别。
1.从加载方法上对比:
get方法不支持延迟加载,而load支持延迟加载。
2.从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
get方法检索不到的话会返回null。
3.从检索执行机制上对比:
get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。
来看具体的例子:
首先是一个持久化类:
public class Pet {
private String userName;
private String password;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
下面是Hibernate的核心配置文件hibernate-cfg.xml代码:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">sa</property>
<property name="connection.url">
jdbc:jtds:sqlserver://localhost:1433/epet
</property>
<property name="dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<property name="myeclipse.connection.profile">pet</property>
<property name="connection.driver_class">
net.sourceforge.jtds.jdbc.Driver
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="com/info/po/Pet.hbm.xml" />
</session-factory>
</hibernate-configuration>
下面是hibernate的另一个配置文件Pet.hbm.xml的代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="com.info.po.Pet" table="login">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="userName" column="username" type="string"></property>
<property name="password" column="password" type="string"></property>
</class>
</hibernate-mapping>
再就是重要的DAO代码了:
import org.hibernate.Session;
import org.hibernate.Transaction;
public class PetDAO {
public void getPetById(int id){
Session session = HibernateSessionFactory.getSession();
Pet pet = (Pet)session.load(Pet.class, id);
System.out.println(pet.getid());
session.close();
}
}
最后是测试类代码:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
PetDAO dao = new PetDAO();
dao.getPetById(10);
}
}
数据库里面的表的结构为:
id |
username |
password |
2 |
aaa |
111 |
3 |
bbb |
222 |
4 |
ccc |
333 |
5 |
ddd |
444 |
上面是使用的是get方法,运行以上代码,结果是:
Exception in thread "main" java.lang.NullPointerException
而改用load方法的话,运行发的结果是:
Exception in thread "main" org.hibernate.ObjectNotFoundException
而如果将将上面的dao代码稍微改下,把System.out.println(pet.getId())放到session.close()之后,
public void getPetById(int id){
Session session = HibernateSessionFactory.getSession();
Pet pet = (Pet)session.load(Pet.class, id);
session.close();
System.out.println(pet.getUserName());
}
同样是使用load方法,但是运行的结果却不一样:
Exception in thread "main" org.hibernate.LazyInitializationException
结论:
对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。
需要注意的是:下面这两段代码不会去执行数据库,因为load后会在hibernate的一级缓存中存放一个map对象,该map的key就是id的值,但是当你getId的时候,它会去一级缓存里拿map的key值,而不会去执行数据库查询,也不会保错。
Pet pet = (Pet)session.load(Pet.class, id);
System.out.println(pet.getUserName());
文章最后,附上本文的源代码,如有不对的地方,晴大家多多指正。
分享到:
相关推荐
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
总的来说,理解Hibernate的`get`和`load`方法的区别是优化数据库操作、提高应用程序性能的关键。开发者应当根据实际情况灵活选择,避免不必要的性能开销,同时充分利用Hibernate的缓存机制来提升应用的响应速度。
在Hibernate框架中,Session是与数据库交互的主要接口,它提供了...了解这些概念和方法的区别对于高效地使用Hibernate进行数据库操作至关重要,可以根据具体场景选择合适的方法来优化应用程序的性能和数据处理逻辑。
`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存中获取指定ID对应的实体对象;如果缓存中不存在,则直接执行SQL查询语句从数据库中...
博文链接:https://log-cd.iteye.com/blog/205166
在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...
`get` 和 `load`: 这两个方法都是用于从数据库中获取单个对象。`get`方法直接返回一个实体对象,如果数据库中没有找到对应ID的数据,则返回null。而`load`方法返回的是一个代理对象,即使数据库中没有对应的记录,...
在Hibernate框架中,`get` 和 `load` 都是用来从数据库中获取对象的方法,但它们之间存在一些关键差异。了解这些差异对于高效地使用Hibernate至关重要。 首先,让我们来看看这两个方法的基本用法: 1. `get` 方法...
《Hibernate难点解析与...理解并灵活运用uuid、get()与load()以及iterator()和list()的区别,是每个Hibernate开发者必备的技能。通过深入学习这些难点,开发者能够更好地驾驭Hibernate,从而提升项目的稳定性和性能。
在Hibernate中,`Session`对象提供了`get`和`load`方法来查询数据。`load`方法采用延迟加载机制,只有在真正使用对象时才会执行SQL,而`get`方法则立即执行查询。`flush()`、`clear()`和`close()`方法分别用于清理...
4. **加载(get()和load())**:这两者都是用于从数据库中获取对象。get()方法直接返回对象,而load()则返回一个代理对象,只有在需要时才从数据库加载数据,以实现懒加载。 5. **查询(createQuery()、...