session的load和get方法都是从数据库中查找对应的数据,并转化为模型对象,在三种状态中属于persisent状态,但是他们之间有的十分大的区别:
GET:
@Test
public void testGet(){
Session session = sessionFactory.getCurrentSession() ;
session.beginTransaction() ;
Teacher t = (Teacher)session.get(Teacher.class, 1) ;
session.getTransaction().commit() ;
}
当我们用session.get()方法时,hibernate直接发出sql语句查找到对应的数据并保存到Teacher对象当中,对象数据直接使用。
LOAD:
@Test
public void testLoad(){
Session session = sessionFactory.getCurrentSession() ;
session.beginTransaction() ;
Teacher t = (Teacher)session.load(Teacher.class, 1) ;
t.getName() ;
session.getTransaction().commit() ;
}
当我们用session.load()方法时,load生成的是Teacher对象的一个代理,而不是直接发出SQL语句取出Teacher对象,当改代理对象不使用时,hibernate不会进行任何数据库的交流,当对象使用时,如t.getName() ;才发出SQL语句进行查询,所以当用LOAD进行加载时候,所有的操作必须在session关闭之前进行,否则将会出现延迟错误现象:
@Test
public void testLoad(){
Session session = sessionFactory.getCurrentSession() ;
session.beginTransaction() ;
Teacher t = (Teacher)session.load(Teacher.class, 1) ;
session.getTransaction().commit() ;
t.getName() ;
}
13:32:29,766 ERROR LazyInitializationException:42 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at com.bjsxt.hibernate.vo.Teacher_$$_javassist_0.getName(Teacher_$$_javassist_0.java)
at HibernateIDTest.testLoad(HibernateIDTest.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
分享到:
相关推荐
【Java学习笔记doc】Hibernate学习教程和笔记 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java开发者与数据库之间的交互。这个文档集合是针对Java初学者和进阶者的一份宝贵资料,旨在深入理解...
get 和 load 方法的区别在于对懒加载(lazy loading)的支持,get 直接加载数据,而 load 支持延迟加载。如果 get 无法找到数据,则返回 null;load 则会抛出异常。 transient 状态的特征是数据库中没有对应记录,...
Hibernate是一款强大的Java持久...通过阅读这份“Hibernate API帮助文档”和“Hibernate学习笔记”,你将能够深入理解Hibernate的工作原理,掌握其API的使用,并能在实际项目中有效地利用Hibernate进行数据持久化操作。
**Hibernate4 学习笔记** Hibernate4 是一个流行的开源对象关系映射(ORM)框架,它简化了Java...在实际开发中,合理配置和使用二级缓存、选择合适的查询方法以及理解load和get的区别,都能显著提升数据库操作的效率。
《Hibernate3.3_学习笔记》是一份详细记录了Hibernate3.3版本特性和使用方法的文档,旨在帮助开发者深入理解和应用这一强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个明星库,它简化了数据库操作,...
**hibernate入门学习笔记+源码** **一、Hibernate简介** Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过提供对象化的数据访问方式,Hibernate消除了传统JDBC代码中的...
5. **CRUD操作**:演示如何使用Hibernate进行增删改查操作,包括save()、update()、delete()和load()、get()方法。 6. **HQL和Criteria查询**:讲解Hibernate特有的查询语言HQL,以及Criteria API,它们是如何替代...
1. **CRUD 操作:** Hibernate 提供了简便的方法进行创建(save()或persist())、读取(get()或load())、更新(update())和删除(delete())操作。 2. **HQL(Hibernate Query Language):** 类似于SQL的查询语言...
本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...
最后,我们学习了基本的增删改查操作,如save()、delete()、update()和get()、load()。 第二天,课程深入到了查询机制,包括HQL(Hibernate Query Language)和Criteria API。HQL是一种面向对象的查询语言,其语法...
**Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...
标题:Hibernate学习笔记3 描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在...
【Hibernate学习笔记】 Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,简化了数据库与Java对象之间的交互。这篇笔记主要涵盖了Hibernate的一些核心概念和常用方法...
《Hibernate学习笔记》 在当前的IT行业中,Java开发者经常面临的一个挑战是将面向对象的软件与关系型数据库集成,这一过程可能既复杂又耗时。Hibernate作为一个优秀的Java环境下的对象/关系型数据库映射(ORM)工具...