Hibernate懒加载之<class>标签上的lazy

本文研究的主要是

lazy的概念:在真正使用某个对象的时候才去加载该对象。

Hibernate的lazy策略可以使用在:

1.<class>标签上,可以取值:true/false。
2.<property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改(这个没多大意义)。
3.<set>和<list>标签上,可以取值:true/false/extra。
4.<many-to-one>和<one-to-one>单端关联标签上,可以取值:false/proxy/noproxy

下面我们来体会一下在class标签上的lazy:

User.java:

public class User {
	/* ID */
	private int id;
	/* 用户名 */
	private String name;
	/* 用户密码 */
	private String password;
	/* 创建时间 */
	private Date createTime;
	//省略setter和getter方法
}

User.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package表示实体类的包名 -->
<hibernate-mapping package="com.lixue.bean">
  <!-- class结点的name表示实体的类名,table表示实体映射到数据库中table的名称 -->
  <class name="User" table="t_user" lazy="true">
    <id name="id">
      <generator class="native" />
    </id> 

    <!-- 映射普通属性 -->
    <property name="name" />
    <property name="password" />
    <property name="createTime" /> 

  </class>
</hibernate-mapping> 

测试方法:

public void testLoad1(){
	/*获取User,load本身就支持延迟加载(class标签的lazy对普通属性有效)*/
	User user = (User) HibernateUtils.getSession().load(User.class, 1);
	/*不会发出sql(因为ID你查询的时候就已经指定了,没必要再去查)*/
	System.out.println("user.id=" + user.getId());
	/*会发出sql,因为此时真正要获取属性了,所以会发出sql语句,并且发出的语句查出了所有属性,后面的属性就不会发出语句了*/
	System.out.println("user.name=" + user.getName());
	/*不会发出sql(在查name的时候已经查出来了)*/
	System.out.println("user.password=" + user.getPassword());
	/*不会发出sql(在查name的时候就已经查出来了)*/
	System.out.println("user.createTime=" + user.getCreateTime());
}

User user = (User) HibernateUtils.getSession().load(User.class, 1);处打一个断点进行测试!

对象会出现在对象user-->handler--->target结点中,如图:

1.最开始target为null,当执行了user.getId()的时候,依然为null,因为ID在我们查询的时候就已经指定了,此时去查询就没什么意义。

2.执行user.getName()的时候就发出了一条语句,如图:

从图中,我们可以看出,查询ID的时候,并没有发出语句,这个我们刚才已经讲了,当我们查询name属性的时候,就发了一条语句,并且这条语句的功能是查询所有的属性。

3.当执行user.getPassword()user.getCreateTime()的时候,就已经不会发出语句了,因为之前已经查询出了属性值。

注:<class>标签上的lazy,只支持普通属性,不会影响类中集合的加载。

总结

以上就是本文关于Hibernate懒加载之<class>标签上的lazy的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • 浅谈解决Hibernate懒加载的4种方式
  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法
(0)

相关推荐

  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hibernate的Session的生命周期变长,直到这个请求结束,具体是通过一个Filter来实现的. 那么,如果现在我们想用Hibernate懒加载特性,又想用延长session的生命周期,知道将数据提到页面显示(经过action层),那么我们就得在web.xml文件中增加以下配置: <!-- 配置

  • 浅谈解决Hibernate懒加载的4种方式

    本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式. 所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载. 例如,有一个对象是Employee,还有一个对象是Department.显然,对于Employee相对Depa

  • Hibernate懒加载之<class>标签上的lazy

    本文研究的主要是 lazy的概念:在真正使用某个对象的时候才去加载该对象. Hibernate的lazy策略可以使用在: 1.<class>标签上,可以取值:true/false. 2.<property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改(这个没多大意义). 3.<set>和<list>标签上,可以取值:true/false/extra. 4.<many-to-one>和<one-to-one>

  • 解决spring boot hibernate 懒加载的问题

    spring boot 是快速构建微服务的新框架. 对于数据访问问题可以直接使用jpa技术,但是在单元测试发现spring jpa存在hibernate懒加载问题. 但是spring-boot没有xml配置文件所以现在网络上好多的解决方案并不能适用在spring boot框架中.在遇到该问题苦苦查询后终于无意中发现了解决方案. Spring application using JPA with Hibernate, lazy-loading issue in unit test 英文不好没有细看

  • 如何解决hibernate一对多注解懒加载失效问题

    目录 hibernate一对多注解懒加载失效 经排查,问题出在controller这边 解决方法 Hibernate懒加载异常说明及其解决 懒加载异常出现的原因 解决方案1 解决方案2 解决方案3 hibernate一对多注解懒加载失效 在House类里有关联HouseInfo,设置了懒加载 但是页面ajax返回还是有HouseInfos的数据. 经排查,问题出在controller这边 @response注解启用jackson框架对House进行解析 然后调用了每个属性的get方法,自然hou

  • SpringBoot预加载与懒加载实现方法超详细讲解

    目录 预加载 getMergedLocalBeanDefinition 循环创建bean 懒加载 @Lazy 全局懒加载 为什么需要全局懒加载 全局懒加载的好处与问题 预加载 bean在springBoot启动过程中就完成创建加载 在AbstractApplicationContext的refresh方法中 // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons()

  • Spring集成JPA配置懒加载报错解决方案

    一:报错no session 因为entitymanager对象在事物提交后就关闭了 报错的 no session相当于sql的session 解决办法:解决办法 在web.xmL配置一个过滤器 使其在这个session中的manager在结束后再关闭open <!--配置openmanager--> <filter> <filter-name>openEntity</filter-name> <filter-class>org.springfr

  • SpringBoot2 JPA解决懒加载异常的问题

    jpa解决懒加载异常 在我上一遍文章上进行行修改,SpringBoot2 实现JPA分页和排序分页 实体类上改: @Entity @Table(name = "employee") @JsonIgnoreProperties(value={"hibernateLazyInitializer", "department"}) public class Employee { @Id @GeneratedValue(strategy = Generat

  • vue组件代码分块和懒加载讲解

    目录 懒加载组件 问题与解决方案 加载中组件 错误处理组件 preload 和 prefetch 总结 前端开发中,随着业务和页面增加,以组件为基本单位的结构下,组件数量会增长极快,为了优化我们会很显然地想要进行一些工作: 代码分块 懒加载非必要资源文件 非必要资源,指的首次渲染出某页面所不必要的资源,如因为用户操作才出现的图片.弹窗等. 代码分块和懒加载在页面层面具有极大的优化作用,用户很可能只是浏览dashboard页面,可能根本就不会去看详情等页面,那我们就不必将详情页面的代码和dashb

  • React 路由懒加载的几种实现方案

    这篇文字简单的介绍了React在路由懒加载方面的几种实现方案. 传统的两种方式 import() 符合ECMAScript提议的import()语法,该提案与普通 import 语句或 require 函数的类似,但返回一个 Promise 对象.这意味着模块时异步加载的 webpack v2+ 使用 使用方式 function component() { return import( /* webpackChunkName: "lodash" */ 'lodash').then(_

随机推荐