hibernate 全面学习【lazy策略 】

news/2024/7/3 1:59:55

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

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


http://lihuaxi.xjx100.cn/news/245200.html

相关文章

python 帮助文档、自我解释

现在让我们以交互方式使用 Python 来开始研究。当我们从命令行启动 Python 时&#xff0c;就进入了 Python shell&#xff0c;在这里可以输入 Python 代码&#xff0c;而且立刻会从 Python 解释器获得响应。 清单 1. 以交互方式启动 Python 解释器 Python 2.7.15rc1 (default, …

基于angularJS和requireJS的前端架构

1、概要描述 1.1、angularJS描述:angularJS是可以用来构建WEB应用的&#xff0c;WEB应用中的一种端对端的完整解决方案。通过开发者呈现一个更高层次的抽象来简化应用的开发。最适合的就是用它来构建一个CRUD应用&#xff0c;它提供了非常方便的且统一高效的解决方案&#xff0…

中秋节,送上一次非常有趣的SQL优化实战经历

点击上方“搜云库技术团队”&#xff0c;选择“设为星标”回复“1024”或“面试题”获取4T学习资料补充&#xff1a;看到好多朋友后台留言说对SQL优化感兴趣&#xff0c;我又重新整理了下文章&#xff0c;将更多关于sql优化的知识分享出来&#xff0c;SQL优化也是面试中必问的知…

LeetCode - Maximum Depth of Binary Tree

递归求二叉树的最大深度。 /*** Definition for binary tree* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ public class Solution {public int maxDepth(TreeNode root) {if(root null)return 0…

关于css中overflow的一些理解

在做移动端开发的时候&#xff0c;遇到过这么个问题&#xff1a;要把图片进行放大&#xff0c;但有时候图片比较长&#xff0c;一个手机的版面看不了&#xff0c;于是需要用到overflow的属性&#xff0c;刚开始用了overflow-y:scroll, 于是问题来了&#xff0c;如果图片没有过长…

使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号

Novell.Directory.Ldap.NETStandard是一个在.NET Core中&#xff0c;既支持Windows平台&#xff0c;又支持Linux平台&#xff0c;进行Windows AD域操作的Nuget包。 首先我们新建一个.NET Core控制台项目&#xff1a;NetCoreLdap&#xff0c;并下载如下Nuget包&#xff1a; Nove…

我,是真是一个培训班出来的程序员

点击上方“搜云库技术团队”&#xff0c;选择“设为星标”回复“1024”或“面试题”获取4T学习资料作者 l HeroMe原作者&#xff1a;HeroMe &#xff0c;文中的"我"均为作者本人。1这个城市的所有人都在忙碌的过生活&#xff0c;他们行色匆匆&#xff0c;车水马龙&am…

无聊的时候,冷死了(六)

阁下长得真是天生励志&#xff01;好久没有听到有人能把牛吹得这么清新脱俗了&#xff01;你出生时就丑的躲起来了&#xff0c;连你父母都不敢见你&#xff0c;你还怕有人举报你&#xff1f;你拉着一头猪逛街&#xff0c;很幸福的样子&#xff0c;我经过满怀同情的说&#xff1…