【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

相关文章
|
23天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
13 1
|
2月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
52 4
|
2月前
|
SQL Java 数据库连接
Hibernate 批量操作来袭!掌握最佳实践,轻松应对数据洪流,开启高效开发新时代
【9月更文挑战第3天】在软件开发中,高效数据操作至关重要。作为流行的Java持久化框架,Hibernate提供了强大的数据库操作功能。本文探讨了Hibernate批量操作,包括批量插入、更新和删除的最佳实践,通过使用原生SQL和`Session`的`createNativeQuery()`方法,结合`addBatch()`及`executeBatch()`方法实现高效批量操作。合理设置批量大小、事务管理和性能测试是优化的关键。在实际开发中,应根据业务需求和性能要求选择合适的方法,以提升程序性能和可维护性。
196 3
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
47 1
|
3月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
205 0
|
3月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
93 0
|
3月前
|
Java 数据库连接 数据库
|
3月前
|
缓存 Java 数据库连接
|
3月前
|
Java 数据库连接 API