2019独角兽企业重金招聘Python工程师标准>>>

lazy策略可以用在:
* <class>标签上:可以取值true/false
* <property>标签上,可以取值true/false,这个特性需要类增强
* <set>/<list>等集合上,可以取值为true/false/extra
* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy 重要的概念:
1、lazy的概念,指在需要的时候才发出sql
2、lazy策略只是在session打开期间才是有效的 注意:
Hibernate类级别的lazy加载策略:可以控制什么时候加载这些普通对象属性 测试单元的使用:
请先运行初时化程序InitData,在执行每个单元测试 Hibernate集合属性的懒加载策略: 在集合属性上,可以配置懒加载策略,取值为:true/false/extra true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其 集合元素的数据
false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据 Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置
懒加载策略。 可以取值为:false/proxy/no-proxy
false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候 才真正发出查询语句查询其对象数据,其关联对象是代理类
no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类 注意:在class标签上配置的lazy属性不会影响到关联对象!!! Java代码
<hibernate-mapping><class name="com.bjsxt.hibernate.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"/></class>
</hibernate-mapping>  Java代码
package com.bjsxt.hibernate;
import org.hibernate.Session;import com.bjsxt.hibernate.Group;
import com.bjsxt.hibernate.HibernateUtils;public class InitData {public static void main(String[] args) {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();Group group = new Group();group.setName("java开发组");session.save(group);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}   }}Java代码 package com.bjsxt.hibernate;import org.hibernate.Session;import junit.framework.TestCase;/*** 运行本单元测试的前提条件:* 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性)* * @author Administrator**/
public class ClassLazyTest extends TestCase {public void testLoadGroup1() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlGroup group = (Group)session.load(Group.class, 1);//不会发出查询sqlSystem.out.println("group id=" + group.getId());//发出查询sql,加载数据到GroupSystem.out.println("group name=" + group.getName());//不会发出查询sqlSystem.out.println("group name=" + group.getName());}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);} }public void testLoadGroup2() {Session session = null;Group group = null;try {session = HibernateUtils.getSession();//不会发出查询sqlgroup = (Group)session.load(Group.class, 1);}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}//不能正常输出,抛出了 LazyInitializationException,因为session已经关闭了//注意:Hibernate支持Lazy策略,只有session打开状态才有效      System.out.println("group name=" + group.getName());}}---------------------------------------------------------------------
集合类测试 Java代码
<hibernate-mapping>   <class name="com.bjsxt.hibernate.Classes" table="t_classes">   <id name="id">   <generator class="native"/>   </id>   <property name="name"/>   <!--    <set name="students" cascade="all" order-by="id">   -->   <set name="students" lazy="extra">   <key column="classid"/>   <one-to-many class="com.bjsxt.hibernate.Student"/>   </set>   </class>
</hibernate-mapping>   <hibernate-mapping>   <class name="com.bjsxt.hibernate.Student" table="t_student">   <id name="id">   <generator class="native"/>   </id>   <property name="name"/>   </class>
</hibernate-mapping>  Java代码
package com.bjsxt.hibernate;import java.util.Iterator;
import java.util.Set;import org.hibernate.Session;import junit.framework.TestCase;/*** 保持lazy的默认值* @author Administrator**/
public class CollectionLazyTest1 extends TestCase {public void testLoadClasses1() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlClasses classes = (Classes)session.load(Classes.class, 1);//会发出一条查询sql,加载数据到classesSystem.out.println("班级:【" + classes.getName() + "】  拥有的学生:");//不会发出查询sqlSet students = classes.getStudents();//会发出一条查询sql,加载数据到Studentsfor (Iterator iter = students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}   }public void testLoadClasses2() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlClasses classes = (Classes)session.load(Classes.class, 1);//会发出一条查询sql,加载数据到classesSystem.out.println("班级:【" + classes.getName() + "】  拥有的学生总数:");//不会发出查询sql   Set students = classes.getStudents();//会发出一条查询sql,加载全部的数据到StudentsSystem.out.println(students.size());}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);} }}Java代码 package com.bjsxt.hibernate;import java.util.Iterator;
import java.util.Set;import org.hibernate.Session;import junit.framework.TestCase;/*** 设置集合上的lazy=false* @author Administrator**/
public class CollectionLazyTest2 extends TestCase {public void testLoadClasses1() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlClasses classes = (Classes)session.load(Classes.class, 1);//会发出两条查询sql,加载数据到classes和Students中System.out.println("班级:【" + classes.getName() + "】  拥有的学生:");//不会发出查询sqlSet students = classes.getStudents();//不会发出查询sqlfor (Iterator iter = students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}   }public void testLoadClasses2() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlClasses classes = (Classes)session.load(Classes.class, 1);//会发出两条查询sql,加载数据到classes和Students中System.out.println("班级:【" + classes.getName() + "】  拥有的学生总数:");//不会发出查询sql Set students = classes.getStudents();//不会发出查询sql   System.out.println(students.size());}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}   }}Java代码
package com.bjsxt.hibernate;import java.util.Iterator;
import java.util.Set;import org.hibernate.Session;import junit.framework.TestCase;/*** 设置集合上的lazy=extra* @author Administrator**/
public class CollectionLazyTest3 extends TestCase {public void testLoadClasses1() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlClasses classes = (Classes)session.load(Classes.class, 1);//会发出一条查询sql,加载数据到classesSystem.out.println("班级:【" + classes.getName() + "】  拥有的学生:");//不会发出查询sqlSet students = classes.getStudents();//会发出一条查询sql,加载数据到studentsfor (Iterator iter = students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());}}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}   }public void testLoadClasses2() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlClasses classes = (Classes)session.load(Classes.class, 1);//会发出一条查询sql,加载数据到classesSystem.out.println("班级:【" + classes.getName() + "】  拥有的学生总数:");//不会发出查询sql   Set students = classes.getStudents();//会发出一条较为智能的查询sql,如://select count(id) from t_student where classid =?System.out.println(students.size());}catch(Exception e) {e.printStackTrace();}finally {HibernateUtils.closeSession(session);}    }}---------------------------------------------------------------- 单端关联加载 Java代码 <hibernate-mapping>   <class name="com.bjsxt.hibernate.Group" table="t_group">   <id name="id">   <generator class="native"/>   </id>   <property name="name"/>   </class>
</hibernate-mapping>   <hibernate-mapping>   <class name="com.bjsxt.hibernate.User" table="t_user" >   <id name="id">   <generator class="native"/>   </id>   <property name="name"/>   <!--   <many-to-one name="group" column="relatedGroup" />   -->   <many-to-one name="group" column="relatedGroup"/>    </class>
</hibernate-mapping>        <hibernate-mapping><class name="com.bjsxt.hibernate.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"/></class>
</hibernate-mapping><hibernate-mapping><class name="com.bjsxt.hibernate.User" table="t_user" ><id name="id"><generator class="native"/></id><property name="name"/><!--<many-to-one name="group" column="relatedGroup" />--><many-to-one name="group" column="relatedGroup"/> </class>
</hibernate-mapping>      Java代码
package com.bjsxt.hibernate;import org.hibernate.Session;import junit.framework.TestCase;/*** 所有lazy的属性默认* @author Administrator**/
public class SingleEndTest1 extends TestCase {public void testLoadUser() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlUser user = (User)session.load(User.class, 2);//会发出一条查询sql,转载数据到UserSystem.out.println("user name=" + user.getName());//不会发出查询sqlGroup group = user.getGroup();//会发出一条查询sql,转载数据到GroupSystem.out.println("related group=" + group.getName());}catch(Exception e) {e.printStackTrace();}finally {}}
}Java代码
package com.bjsxt.hibernate;import org.hibernate.Session;import junit.framework.TestCase;/*** 将<class>标签中的lazy设置为false* @author Administrator**/
public class SingleEndTest2 extends TestCase {public void testLoadUser() {Session session = null;try {session = HibernateUtils.getSession();//会发出一条查询sql,转载数据到UserUser user = (User)session.load(User.class, 2);//不会发出查询sqlSystem.out.println("user name=" + user.getName());//不会发出查询sqlGroup group = user.getGroup();//会发出一条查询sql,转载数据到GroupSystem.out.println("related group=" + group.getName());}catch(Exception e) {e.printStackTrace();}finally {}}
}Java代码
package com.bjsxt.hibernate;   import org.hibernate.Session;   import junit.framework.TestCase;   /**  * 保持<class>标签中的lazy默认设置  * 将<many-to-one>标签中加入lazy=false  * @author Administrator  *  */
public class SingleEndTest3 extends TestCase {   public void testLoadUser() {   Session session = null;   try {   session = HibernateUtils.getSession();   //会发出一条查询sql,转载数据到User   User user = (User)session.load(User.class, 2);   //不会发出查询sql   System.out.println("user name=" + user.getName());   //不会发出查询sql   Group group = user.getGroup();   //会发出一条查询sql,转载数据到Group   System.out.println("related group=" + group.getName());   }catch(Exception e) {   e.printStackTrace();   }finally {   }   }
}

摘自:http://penghao122.javaeye.com/blog/211598

转载于:https://my.oschina.net/zlp5201/blog/404148

hibernate 全面学习【lazy策略 】相关推荐

  1. hibernate教程--抓取策略详解

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  2. hibernate教程--抓取策略

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  3. 【大话hibernate】hibernate系统学习大合集

    转载请注明出处:http://blog.csdn.net/column/details/hibernatebylmb.html 为了方便各位网友学习以及方便自己复习之用,将Jhibernate系统学习 ...

  4. Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

    假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session ...

  5. Hibernate缓存原理与策略 Hibernate缓存原理:

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

  6. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  7. 基于按annotation的hibernate主键生成策略

    这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...

  8. JPA实体注解与hibernate主键生成策略

    JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...

  9. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

最新文章

  1. filter2D函数
  2. Spring教程--IOC(注解方式)和整合junit
  3. scikit-learn实现ebay数据分析 的随笔
  4. 如何深入浅出的理解数据仓库建模?
  5. 三维重建:深度传感技术的中外差异
  6. C51单片机————定时器计数器
  7. ASP.NET的属性绑定、表达式绑定、集合绑定、方法绑定、DropDownList集合绑定、DataList绑定、GridView绑定
  8. python对城市规划_城市规划哪些环节可以可以用数据完美解决?
  9. Codeforces Round #309 (Div. 1) A(组合数学)
  10. Count Primes
  11. pads9.5在win10中选项字体显示不全问题解决补丁下载(网盘免费下载)
  12. 中小型、创业型教育机构如何开拓线上市场?
  13. 微软邮箱smtp服务器,微软hotmail免费邮箱申请(5G邮箱容量) 支持pop3、smtp
  14. RK3288 系统升级流程
  15. Chome浏览器播放语音、视频无声音的解决办法
  16. 纪首领浙大计算机学院,趣链科技X浙江大学|区块链技术与应用专题研讨会成功召开...
  17. Arduino + Lcd1602 显示当前环境温度
  18. React源码解读之更新的创建
  19. 简单python爬取微博并写入excel
  20. Day13 多态、Object、抽象、接口

热门文章

  1. 高性能微服务架构设计模式@霞落满天
  2. 一种将快捷方式从开始菜单“常用应用”的中去除的方法
  3. 一种清除windows通知区域“僵尸”图标的方案——问题分析
  4. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现1
  5. MFC如何打开文件路径
  6. python远程登录linux命令,Python+requests通过paramiko远程登录Linux执行sh命令
  7. tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...
  8. 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...
  9. eas 在linux下安装_有在linux系统安装eas7.5的没???求指点
  10. 基于python的压测工具_Python Locust性能测试简介及框架实践