hibernate 全面学习【lazy策略 】
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策略 】相关推荐
- hibernate教程--抓取策略详解
Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...
- hibernate教程--抓取策略
Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...
- 【大话hibernate】hibernate系统学习大合集
转载请注明出处:http://blog.csdn.net/column/details/hibernatebylmb.html 为了方便各位网友学习以及方便自己复习之用,将Jhibernate系统学习 ...
- Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)
假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session ...
- Hibernate缓存原理与策略 Hibernate缓存原理:
Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...
- Hibernate基础学习2
Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...
- 基于按annotation的hibernate主键生成策略
这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...
- JPA实体注解与hibernate主键生成策略
JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...
- 设计模式学习笔记——策略(Strategy)模式
设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...
最新文章
- filter2D函数
- Spring教程--IOC(注解方式)和整合junit
- scikit-learn实现ebay数据分析 的随笔
- 如何深入浅出的理解数据仓库建模?
- 三维重建:深度传感技术的中外差异
- C51单片机————定时器计数器
- ASP.NET的属性绑定、表达式绑定、集合绑定、方法绑定、DropDownList集合绑定、DataList绑定、GridView绑定
- python对城市规划_城市规划哪些环节可以可以用数据完美解决?
- Codeforces Round #309 (Div. 1) A(组合数学)
- Count Primes
- pads9.5在win10中选项字体显示不全问题解决补丁下载(网盘免费下载)
- 中小型、创业型教育机构如何开拓线上市场?
- 微软邮箱smtp服务器,微软hotmail免费邮箱申请(5G邮箱容量) 支持pop3、smtp
- RK3288 系统升级流程
- Chome浏览器播放语音、视频无声音的解决办法
- 纪首领浙大计算机学院,趣链科技X浙江大学|区块链技术与应用专题研讨会成功召开...
- Arduino + Lcd1602 显示当前环境温度
- React源码解读之更新的创建
- 简单python爬取微博并写入excel
- Day13 多态、Object、抽象、接口
热门文章
- 高性能微服务架构设计模式@霞落满天
- 一种将快捷方式从开始菜单“常用应用”的中去除的方法
- 一种清除windows通知区域“僵尸”图标的方案——问题分析
- 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现1
- MFC如何打开文件路径
- python远程登录linux命令,Python+requests通过paramiko远程登录Linux执行sh命令
- tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...
- 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...
- eas 在linux下安装_有在linux系统安装eas7.5的没???求指点
- 基于python的压测工具_Python Locust性能测试简介及框架实践