对于hibernate的延迟加载,就是对一个对象加载的时候,不去加载他的相关的对象。
以立即加载中的student和team为例子:
如果student延迟加载team,team立即加载student
Session session = SessionUtil.getSession();
Transaction tran = session.beginTransaction();
Student stu = (Student)session.get(Student.class, 2);
tran.commit();
session.close();
//关闭 SESSION
System.out.println(stu.getName());
System.out.println(stu.getTeamID().getName());
System.out.println(stu.getTeamID().getStudents().size());
这样操作会报错,原因是学生对班级是延迟加载,在SESSION关闭以后,班级对象是加载不到的。
修改方式1:
Session session = SessionUtil.getSession();
Transaction tran = session.beginTransaction();
Student stu = (Student)session.get(Student.class, 2);
tran.commit();
session.close();
//打开另外一个SESSION,然后让他重新关联班级对象
Session session2 = SessionUtil.getSession();
Transaction tran2 = session2.beginTransaction();
session2.update(stu.getTeamID());
System.out.println(stu.getName());
System.out.println(stu.getTeamID().getName());
System.out.println(stu.getTeamID().getStudents().size());
tran2.commit();
session2.close();
打印:
1.Hibernate: select student0_.ID as ID1_0_, student0_.Name as Name1_0_, student0_.TeamID as TeamID1_0_ from test.student student0_ where student0_.ID=?
2.tuping
3.Hibernate: select team0_.ID as ID0_0_, team0_.Name as Name0_0_ from test.team team0_ where team0_.ID=?
4.二中
5.Hibernate: select students0_.teamID as teamID1_, students0_.ID as ID1_, students0_.ID as ID1_0_, students0_.Name as Name1_0_, students0_.TeamID as TeamID1_0_ from test.student students0_ where students0_.teamID=?
6.2
对于1的解释:通过开启另外一个SESSION重新关联班级学生对象,因为学生对班级是延迟的,所以加载学生的时候不加载班级。
对于2的解释:打印学生姓名
对于3的解释:因为要打印班级的名称,所以重新关联班级信息,发出查询语句。
对于4的解释:打印班级名称。
对于5的解释:然后查询班级中学生的个数,发出查询语句,因为在1出关联学生对象的时候,已经将一个学生放到内存中了,所以在查询学生人数的时候只发送另外一条去查询剩余的学生人数。这也是HIBERNATE的高明的地方。内存中有的数据就不再发送SQL去查询了。
对于6的解释:打印班级人数2.
2.修改方式2(黑体字部分是多加的语句)
Session session = SessionUtil.getSession();
Transaction tran = session.beginTransaction();
Student stu = (Student)session.get(Student.class, 2);
tran.commit();
session.close();
Session session2 = SessionUtil.getSession();
Transaction tran2 = session2.beginTransaction();
session2.update(stu.getTeamID());
Hibernate.initialize(stu.getTeamID());
Hibernate.initialize(stu.getTeamID().getStudents());
System.out.println(stu.getName());
System.out.println(stu.getTeamID().getName());
System.out.println(stu.getTeamID().getStudents().size());
tran2.commit();
session2.close();
通过hibernate.initialize的方法重新将team进行关联,这个方法仅仅初始化一个代理对象或集合,并不能保证代理或集合内部嵌套的代理,所以初始化班级代理并不初始化学生集合,所以要写另外一条语句对学生集合进行初始化。
打印:
1.Hibernate: select student0_.ID as ID1_0_, student0_.Name as Name1_0_, student0_.TeamID as TeamID1_0_ from test.student student0_ where student0_.ID=?
2.Hibernate: select team0_.ID as ID0_0_, team0_.Name as Name0_0_ from test.team team0_ where team0_.ID=?
3.Hibernate: select students0_.teamID as teamID1_, students0_.ID as ID1_, students0_.ID as ID1_0_, students0_.Name as Name1_0_, students0_.TeamID as TeamID1_0_ from test.student students0_ where students0_.teamID=?
4.tuping
5.二中
6.2
该打印语句跟修改的第一种方式是一样的只是在加载的时候顺序不一样。原因是通过initial方法,将初始化班级以及班级中的学生数量。所以一开始就将对象初始化完毕,在打印的时候就不再发出查询语句了。
session.update方法的作用主要有两点:
1.更新对象
2.将脱管对象和SESSION进行关联。
分享到:
相关推荐
5. **懒加载(Lazy Loading)**:为了提高性能,Hibernate允许关联对象延迟加载,即只有在实际访问时才加载,通过@ManyToOne、@OneToOne等注解配合fetch="LAZY"实现。 6. **级联操作(Cascading)**:通过@cascade...
Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS论坛系统 Flex整合Hiernate的BBS...
《Hibernate核心库与依赖解析》 Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发者在处理数据库操作时的得力助手。它通过提供一套API,将复杂的SQL语句与Java对象相绑定,使得开发者可以专注于业务...
hiernate 3.6.10 api chm
### Hiernate课件知识点详述 #### 一、Hibernate简介 **1.1 什么是Hibernate?** Hibernate是一个开源框架,能够自动地根据XML完成对象关系映射(ORM),并将对象持久化到数据库中。它是连接Java应用程序和关系...
标题中的"spring2.5.6 +struts2.1.8+hiernate3.3.2(jar)"指的是一个集成开发环境,它包含了三个关键的Java Web框架:Spring 2.5.6、Struts 2.1.8和Hibernate 3.3.2。这些框架在Java应用开发中扮演着重要的角色,尤其...
在Struts+Hibernate+Spring的集成中,Ajax通常用于局部更新视图,比如表格数据的动态加载,或者表单验证的即时反馈,这样提高了交互的流畅性,减少了网络传输开销。 在"2008.4.3Spring(四)整合Struts"这个文件中,...
在本项目"jsp_spring_dao_hiernate_spring登录_truthf1m_"中,我们主要探讨了如何利用Spring框架实现一个登录功能。这个项目涵盖了Web开发中的几个关键组件,包括JSP(JavaServer Pages)、Spring框架的核心部分,...
2. **配置Hibernate**:编写Hibernate的配置文件(如hibernate.cfg.xml),指定数据库连接信息,加载映射文件(hbm.xml)以定义实体类和数据库表之间的映射。 3. **整合XFire与Spring**:通过Spring的Bean配置,将...
- `load` 方法则默认使用延迟加载策略,只有在访问对象属性或者强制初始化时才会触发实际的数据库查询。 在上述测试类的例子中,我们看到当尝试通过`get`方法获取ID为7的Book对象时,由于数据库中不存在该记录,`...
《基于Struts2+Spring+Hibernate+DWR+jQuery UI的学生成绩管理系统详解》 在信息化时代,教育管理系统的建设对于提升教学效率、优化管理流程具有重要意义。本项目——"学生成绩管理系统",采用了一种先进的技术栈,...
Hiernate 开始加载时,会默认的方式去工程src目录下扫描 hibernate.cfg.xml文件,然后加载配制 public class H3Utils { private static SessionFactory factory = new Configuration().configure()....
### Hibernate 常用方法详解 #### 一、前言 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互过程。本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`...
Struts2、Spring和Hibernate是Java Web开发中的三个核心框架,它们共同构成了经典的“SSH”架构,用于构建高效、可维护的大型企业级应用。这个架构整合了MVC(Model-View-Controller)设计模式、依赖注入(DI)与...
在本项目中,我们使用了JSF 1.2_04、Hibernate 3.2.2.ga和Spring 2.0.5这三个技术栈来构建一个基于Java的Web应用程序。这种组合通常被称为JEE(Java Enterprise Edition)的轻量级版本,允许开发者在不依赖完整的EJB...
利用Strtus2+hibernate+spring实现的用户管理小项目(内含mysql数据库脚本和所需的所有jar包),另外里面自己也做了一些封装,这个项目的说明可以参考我发表的博客"对SSH的一些认知
本文档是在整合struts2,spring4,hiernate4后所做的笔记以及怎么整合技巧
- **Model层**:实体对象类(如`Shenhe`)和映射配置文件(如`Shenhe.hbm.xml`)位于`com.hiernate.persistence`包中。公共操作类(如数据库操作和业务功能方法)位于`com.hiernate.util`包下,包括`GetHibernate`...