`

Hibernate学习之----------get与load的区别

阅读更多

 

 

在hibernate中获取每个具体对象可以使用get或者load来获取,但这两者获取有很大的差别哦!

 

1.get方式获取对象

   使用该方式获取对象时是直接使用sql语句从数据库获取数据赋值到一个对象上!

   使用方法如下:

  

Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx = session.beginTransaction();
		Student s = (Student) session.get(Student.class, 3);
		//在session没有关闭时可以获取到该对象的属性
		System.out.println(s.getAge());
		tx.commit();
		session.close();
		sf.close();
		//在session关闭后仍能获取到该对象属性
		System.out.println(s.getAge());

 运行结果如下:

Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, student0_.age as age0_0_ from student student0_ where student0_.id=?
1
1
说明在采用get方式是调用get方法后立即产生sql语句查询数据.这样在session关闭后该对象属性也已经获取到。可与load对比.

 

2.load方式获取对象

  采用此方式时如在session已关闭的但关闭之前为获取过该对象属性,那么该对象实际上不存在。

如下:

 

 

Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx = session.beginTransaction();
		Student s = (Student) session.load(Student.class, 3);
		//在session没有关闭时可以获取到该对象的属性
		//System.out.println(s.getAge());
		tx.commit();
		session.close();
		sf.close();
		//在session关闭后且之前没有获取过该对象属性将不能获取到该对象属性,产生异常
		System.out.println(s.getAge());

 

 运行结果产生异常:因为在session 关闭之前没有获取过该对象属性因此该对象为空,换句话说load方式获取是在session未关闭且获取该对象属性时执行sql获取数据的.

 

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
 at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
 at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
 at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
 at ly.suse.model.Student_$$_javassist_1.getAge(Student_$$_javassist_1.java)
 at TeacherTest.main(TeacherTest.java:36)

 

 

 

现在我们将注释代码取去掉,将能正常工作:

 

 

 

 

Configuration cfg = new Configuration();
		SessionFactory sf = cfg.configure().buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx = session.beginTransaction();
		Student s = (Student) session.load(Student.class, 3);
		//在session没有关闭时可以获取到该对象的属性
		System.out.println(s.getAge());
		tx.commit();
		session.close();
		sf.close();
		//在session关闭后且之前获取过该对象属性能获取到该对象属性
		System.out.println(s.getAge());

 

运行结果如下:

Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, student0_.age as age0_0_ from student student0_ where student0_.id=?
1
1

 而且:

Get()和load()是先在缓存中查找对象,如果找不到再去数据库中查询;
Find()是无论何时都在数据库中查询对象。

不知你看明白了没!

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    hibernate get load区别

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

    hibernate-release-4.3.8.Final

    在4.3.8.Final中,Session的实现更加强大,提供了诸如save()、update()、delete()等方法进行数据的增删改,以及get()、load()等方法进行查询。同时,Criteria API和HQL(Hibernate Query Language)的使用让查询更加...

    hibernate-release-4.2.2.Final.zip

    Hibernate提供了一套完整的生命周期管理机制,包括持久化(persist)、加载(load)、检索(get)、更新(update)、删除(delete)等操作。同时,它支持延迟加载(Lazy Loading),避免了内存消耗和性能瓶颈。 五...

    hibernate-release-5.2.10

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

    hibernate-release-5.2.11.Final.zip

    4. **持久化操作**:Hibernate提供了一系列API来进行CRUD(创建、读取、更新、删除)操作,如`Session`接口中的`save()`, `update()`, `delete()`, `load()`和`get()`方法。 5. **HQL(Hibernate Query Language)*...

    hibernate-release-5.0.6.Final

    3. CRUD操作:通过Session对象的save()、update()、delete()、get()和load()方法实现增删改查。 4. 查询:使用Query或Criteria API构造查询条件,通过list()、uniqueResult()等方法获取结果。 总结,Hibernate ...

    hibernate-release-5.0.7.Final.zip官方

    ### Hibernate 5.0.7.Final版本解析与应用指南 #### 一、概述 Hibernate 是一款开源的对象关系映射(Object-Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库存储的高效管理和访问能力。...

    hibernate-release-5.0.6.Final.zip(最新Hibernate架包)

    例如,使用`save()`或`saveOrUpdate()`方法保存对象,`delete()`删除对象,`get()`或`load()`查询对象,`Query`或`Criteria`接口进行复杂的查询。 8. **缓存机制**:Hibernate支持二级缓存,它可以提高数据读取效率...

    hibernate-release-5.1.16.Final

    - 加载(Load/Get):根据主键从数据库中获取对象。 - 查询(Query):使用HQL或Criteria API进行复杂查询。 六、缓存机制 Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),提高...

    hibernate--- jar包

    增删查改(CRUD)可以通过Session的save()、update()、delete()、get()、load()、query()等方法完成。 6. **事务处理**: Hibernate支持JTA(Java Transaction API)和JDBC事务。对于数据库操作,通常需要在事务中...

    hibernate-3.3.2.GA-jar包集合

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程语言(如Java)来处理数据库操作,极大地简化了数据库应用程序的开发。在这个“hibernate-3.3.2.GA-jar包集合”中,我们聚焦的是...

    hibernate入门--第一个实例

    - **读取(READ)**: `get()`用于根据ID获取对象,`load()`用于延迟加载,`createQuery()`或`createSQLQuery()`用于执行HQL(Hibernate查询语言)或SQL查询。 - **更新(UPDATE)**: 修改对象属性后,调用`update()`...

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

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

    hibernate中get和load方法的区别

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

    hibernate-release-5.0.12.Final.rar

    如Session的`save()`, `update()`, `delete()`方法用于对象的持久化,`get()`和`load()`用于查询,`Query`和`Criteria`接口则支持更复杂的查询需求。 6. **事务管理** Hibernate支持JTA和JDBC两种事务管理方式。在...

    hibernate-min-lib.rar

    "hibernate-min-lib.rar" 提供了一个精简版的Hibernate库,包含了学习和开发过程中最基本、最核心的功能,足以满足初学者对Hibernate框架的理解与实践需求。 一、Hibernate概述 Hibernate 是一款开源的Java ORM框架...

    hibernate-release-5.4.18.Final.zip

    3. 数据库操作:通过SessionFactory获取Session,然后调用Session的save()、update()、delete()、get()、load()等方法进行CRUD操作。 4. 查询语句:利用Query或Criteria API编写HQL(Hibernate Query Language)或...

    hibernate-MySQL-java

    如果需要查询数据,我们可以使用Session的get()或load()方法,或者使用Criteria、HQL(Hibernate Query Language)或JPQL(Java Persistence Query Language)进行更复杂的查询。 Eclipse作为流行的Java集成开发...

    hibernate-3.0.5-api

    4. 加载和检索:使用Session的get()或load()方法加载对象,query()方法执行查询。 五、查询语言 1. HQL:Hibernate的查询语言,类似于SQL,但面向对象,支持复杂的查询表达式和函数。 2. Criteria API:提供更面向...

Global site tag (gtag.js) - Google Analytics