【hibernate框架】核心开发接口-load和get方法

简介:
Load方法,从数据库里取数据,并封装成JAVA对象。
示例:
public void testLoad(){
	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();
		
	Session session=sf.openSession();
	session.beginTransaction();
	//形参1:class-将取出的数据当做什么对象来存取
	//形参2:serializable-主键
	//从数据库中取出主键为1(这里是id为1)的数据,并封装成一个JAVA对象
	Teacher teacher=(Teacher)session.load(Teacher.class, 1);
	System.out.println(teacher.getName()+" "+teacher.getTitle());
	session.getTransaction().commit();
	session.close();
	sf.close();
}
结果:取出了数据库中ID为1的数据,并且将Name和Title打印出来



Get方法,与Load方法的效果一样。

示例:

@Test
public void testGet(){
	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();
	
	Session session=sf.openSession();
	session.beginTransaction();
	//形参1:class-将取出的数据当做什么对象来存取
	//形参2:serializable-主键
	//从数据库中取出主键为1(这里是id为1)的数据,并封装成一个JAVA对象
	Teacher teacher=(Teacher)session.get(Teacher.class, 1);
	System.out.println(teacher.getName()+" "+teacher.getTitle());
	session.getTransaction().commit();
	session.close();
	sf.close();
}
结果:取出了数据库中ID为1的数据,并且将Name和Title打印出来




Get与Load的区别在于:
1.当session关闭后,使用Get方法从数据库得到的对象仍能查看和使用;
原理:当我们用session的get方法去拿对象的时候,它马上会发出sql语句,然后从数据库取出值装到这个对象里面去。


2.session关闭后,使用Load方法取出的对象就会报错了,报错的内容为org.hibernate.LazyInitializationException。LazyInitializationException就是延迟初始化异常,错误内容是could not initialize proxy - no Session。


原因是:用Load去拿对象的时候,load拿到的是一个代理,这个代理并没有真正的发出sql语句,当你要获取这个对象的某个内容的时候,才执行sql语句。这整个过程都需要session的存在来帮它发出sql语句得到想要的内容。


有意思的地方:你用一个不存在的主键去获取一个对象,用load不会报错,但是用get会报错,原因就在于,get会立即发出sql语句,发现没有这个id的数据,而load只是拿到这个数据的代理,并没有真正的去发出sql语句,等到你去使用或查看你取出的对象的内容的时候才会发出sql语句,这个时候就会报错了。


测试:
session关闭后,输出teacher的getClass()方法的值。
用get得到:class cn.edu.hpu.model.Teacher
用load得到:class cn.edu.hpu.model.Teacher_$$_javassist_1

class cn.edu.hpu.model.Teacher_$$_javassist_1是class cn.edu.hpu.model.Teacher的子类,是一个代理对象(代理类),重写了父类的方法,检查有么有发出sql语句,没有就发出。javassist是专门生成动态代理的类库,也就是能直接生成二进制码的类库,没有编译等过程。


转载请注明出处:http://blog.csdn.net/acmman

相关文章
|
5天前
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
|
10天前
|
Java 数据库连接
杨老师课堂之JavaEE三大框架Hibernate入门第一课
杨老师课堂之JavaEE三大框架Hibernate入门第一课
8 0
|
2月前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
2月前
|
SQL 缓存 Java
Java一分钟之-Hibernate:ORM框架实践
【5月更文挑战第15天】Hibernate是Java的ORM框架,简化数据库操作。本文列举并解决了一些常见问题: 1. 配置SessionFactory,检查数据库连接和JDBC驱动。 2. 实体类需标记主键,属性映射应匹配数据库列。 3. 使用事务管理Session,记得关闭。 4. CRUD操作时注意对象状态和查询结果转换。 5. 使用正确HQL语法,防止SQL注入。 6. 根据需求配置缓存。 7. 懒加载需在事务内处理,避免`LazyInitializationException`。理解和避免这些问题能提升开发效率。
43 0
|
2月前
|
SQL Java 关系型数据库
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
39 2
|
2月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
12月前
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
145 0
|
10月前
|
Java 数据库连接
简述使用Hibernate框架的几个步骤
简述使用Hibernate框架的几个步骤
44 0
|
SQL XML 缓存
认识 ORM 框架 Hibernate,为什么 2022 年了还在谈论它?
前言 Hibernate 作为一种全自动 ORM 框架,在几年前常与 Spring、Struts2 一起使用,并称 SSH,作为主流的企业级应用框架。伴随着 MyBatis 的诞生,以及 Hibernate 本身的一些缺陷,如今 Hibernate 已经慢慢淡出了大家的视野。
528 0
认识 ORM 框架 Hibernate,为什么 2022 年了还在谈论它?
|
11月前
|
SQL Java 关系型数据库
Hibernate框架概述
Hibernate框架概述
89 0