在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`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
在4.3.8.Final中,Session的实现更加强大,提供了诸如save()、update()、delete()等方法进行数据的增删改,以及get()、load()等方法进行查询。同时,Criteria API和HQL(Hibernate Query Language)的使用让查询更加...
Hibernate提供了一套完整的生命周期管理机制,包括持久化(persist)、加载(load)、检索(get)、更新(update)、删除(delete)等操作。同时,它支持延迟加载(Lazy Loading),避免了内存消耗和性能瓶颈。 五...
4. 加载和检索:get()和load()加载单个对象,find()和query()用于执行HQL或Criteria查询。 六、级联操作 通过设置属性 cascade,可以控制实体间的操作是否级联,例如级联保存、更新、删除等。 七、缓存机制 ...
4. **持久化操作**:Hibernate提供了一系列API来进行CRUD(创建、读取、更新、删除)操作,如`Session`接口中的`save()`, `update()`, `delete()`, `load()`和`get()`方法。 5. **HQL(Hibernate Query Language)*...
3. CRUD操作:通过Session对象的save()、update()、delete()、get()和load()方法实现增删改查。 4. 查询:使用Query或Criteria API构造查询条件,通过list()、uniqueResult()等方法获取结果。 总结,Hibernate ...
### Hibernate 5.0.7.Final版本解析与应用指南 #### 一、概述 Hibernate 是一款开源的对象关系映射(Object-Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库存储的高效管理和访问能力。...
例如,使用`save()`或`saveOrUpdate()`方法保存对象,`delete()`删除对象,`get()`或`load()`查询对象,`Query`或`Criteria`接口进行复杂的查询。 8. **缓存机制**:Hibernate支持二级缓存,它可以提高数据读取效率...
- 加载(Load/Get):根据主键从数据库中获取对象。 - 查询(Query):使用HQL或Criteria API进行复杂查询。 六、缓存机制 Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),提高...
增删查改(CRUD)可以通过Session的save()、update()、delete()、get()、load()、query()等方法完成。 6. **事务处理**: Hibernate支持JTA(Java Transaction API)和JDBC事务。对于数据库操作,通常需要在事务中...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程语言(如Java)来处理数据库操作,极大地简化了数据库应用程序的开发。在这个“hibernate-3.3.2.GA-jar包集合”中,我们聚焦的是...
- **读取(READ)**: `get()`用于根据ID获取对象,`load()`用于延迟加载,`createQuery()`或`createSQLQuery()`用于执行HQL(Hibernate查询语言)或SQL查询。 - **更新(UPDATE)**: 修改对象属性后,调用`update()`...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
如Session的`save()`, `update()`, `delete()`方法用于对象的持久化,`get()`和`load()`用于查询,`Query`和`Criteria`接口则支持更复杂的查询需求。 6. **事务管理** Hibernate支持JTA和JDBC两种事务管理方式。在...
"hibernate-min-lib.rar" 提供了一个精简版的Hibernate库,包含了学习和开发过程中最基本、最核心的功能,足以满足初学者对Hibernate框架的理解与实践需求。 一、Hibernate概述 Hibernate 是一款开源的Java ORM框架...
3. 数据库操作:通过SessionFactory获取Session,然后调用Session的save()、update()、delete()、get()、load()等方法进行CRUD操作。 4. 查询语句:利用Query或Criteria API编写HQL(Hibernate Query Language)或...
如果需要查询数据,我们可以使用Session的get()或load()方法,或者使用Criteria、HQL(Hibernate Query Language)或JPQL(Java Persistence Query Language)进行更复杂的查询。 Eclipse作为流行的Java集成开发...
4. 加载和检索:使用Session的get()或load()方法加载对象,query()方法执行查询。 五、查询语言 1. HQL:Hibernate的查询语言,类似于SQL,但面向对象,支持复杂的查询表达式和函数。 2. Criteria API:提供更面向...