当前位置: 首页 > 编程日记 > 正文

hibernate 全面学习【lazy策略 】

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

相关文章:

深度学习发现古人类遗址,AI 考古比胡八一更高效

作者 |神经星星来源 |HyperAI超神经By 超神经内容一览&#xff1a;伊利诺伊州立大学人类学专业考古方向的研究人员&#xff0c;将空间遥感技术和深度学习应用于古人类遗址的发掘和研究。关键词&#xff1a;考古 遥感 机器视觉考古&#xff0c;一直是个神秘又充满吸引力的话题。…

linux resource

1. centos repo https://centos.pkgs.org/转载于:https://www.cnblogs.com/gojoin/p/8241068.html

MySQL 水平分区方案Spock Proxy

Spock Proxy 是由实际项目产生的一个开源项目&#xff08;Spock是Rails的应用&#xff0c;Speck Proxy应当可用于Rails之外的&#xff0c;例如PHP或.NET&#xff09;&#xff0c;基于MySQL Proxy开发&#xff0c;是MySQL Proxy的一个分支&#xff0c;支持range-based horizonta…

卷学历、卷加班……程序员拥有什么能力才能破局内卷?

全世界的天才程序员都在疯狂的造轮子&#xff0c;其它程序员只能被动的学习轮子&#xff0c;这简直就像一场绝地求生。程序员行业的内卷已是有目共睹&#xff0c;选择程序员作为职业的人越来越多&#xff1b;大厂对程序员的学历要求越来越高&#xff1b;程序员工作加班越来越严…

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…

2018年IT市场最大的技术趋势和热点预测

随着数字化&#xff0c;物联网&#xff08;IoT&#xff09;设备&#xff0c;区块链应用以及新的服务器战略日益普及&#xff0c;这可能会成为2018年最大的技术趋势。我们期待看到大量与边缘计算相关的新产品&#xff0c;即所谓的无服务器计算&#xff0c;智能家居&#xff0c;智…

哈希分布与一致性哈希算法简介

前言 在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了。相信memcache的基本原理大家也都了解过了&#xff0c;memcache虽然是分布式的应用服务&#xff0c;但分布的原则是由client端的api来决定的&#xff0c;api根据存储用的key以及已知的服务器列表&…

使用深度学习阅读和分类扫描文档

作者|小白来源|小白学视觉收集数据首先&#xff0c;我们要做的第一件事是创建一个简单的数据集&#xff0c;这样我们就可以测试我们工作流程的每一部分。理想情况下&#xff0c;我们的数据集将包含各种易读性和时间段的扫描文档&#xff0c;以及每个文档所属的高级主题。我找不…

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

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

Java EE 开发环境搭建

下载安装Java EE SDK 版本&#xff1a;Java Platform,Enterprise Edition 7 SDK (with JDK 7u45) 下载页面&#xff1a; http://www.oracle.com/technetwork/java/javaee/downloads/java-ee-7-sdk-with-jdk-u45-2066865.html 文件名&#xff1a;java_ee_sdk-7-jdk7-windows.exe…

memcacheq 服务安装与原理

memcacheQ是一个单纯的分布式消息队列服务。它的安装依赖于BerkeleyDB 和 libevent&#xff0c;所以要先安装这BerkeleyDB和libevent&#xff1a; 一&#xff0c;BerkeleyDB 下载软件包&#xff0c;http://download.oracle.com/berkeley-db/db-5.0.21.tar.gz解压缩后&#xff…

AI 帮忙找 Bug ,英特尔开源代码编程工具 ControlFlag

整理 | 孙胜出品 | CSDN近日&#xff0c;英特尔开源了自动代码调试工具 ControlFlag 源代码&#xff0c;ControlFlag 源码现在可通过 GitHub 获得。据了解&#xff0c;ControlFlag 可用来帮助更多开发者自主检测代码错误&#xff0c;主要利用 AI 自动识别软件和固件代码中的错误…

一次心惊肉跳的服务器误删文件的恢复过程

经历了两天不懈努力&#xff0c;终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此&#xff0c;警醒自己&#xff0c;也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。事故背景安排一个妹子在一台生产服务器上安装Oracle,妹子边研…

【vue】vue中ref用法

1.获取当前元素&#xff1a; 例子&#xff1a; <div class"pop pos-a" :style"{ left: pop_x px ,top: pop_y px}" ref"refName"><ul><li>编辑部门</li><li click"append()">添加子部门</li>&…

使用Gearman做分布式计算

通常&#xff0c;多语言多系统之间的集成是个大问题&#xff0c;一般来说&#xff0c;人们多半会采用WebService的方式来处理此类集成问题&#xff0c;但不管采用何种风格的WebService&#xff0c;如RPC风格&#xff0c;或者REST风格&#xff0c;其本身都有一定的复杂性。相比之…

把数据库中有关枚举项值的数字字符串转换成文字字符串

原文:把数据库中有关枚举项值的数字字符串转换成文字字符串标题可能无法表达我的本意。比如&#xff0c;有这样一个枚举&#xff1a; public enum MyChoice{MyFirstChoice 0,MySecondChoice 1,MyThirdChoice 2} 数据库中&#xff0c;某表某字段保存值为"0,1,2"&…

又被 AI 抢饭碗?2457 亿参数规模,全球最大中文人工智能巨量模型 “源1.0”正式开源...

作者 | 伍杏玲 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;输入&#xff1a;昔我往矣&#xff0c;杨柳依依。今我来思&#xff0c;雨雪霏霏。行道迟迟&#xff0c;载渴载饥。我心伤悲&#xff0c;莫知我哀&#xff01;&#xff08;以战争为题写一首诗&#xff09…

Java架构演进之路

2019独角兽企业重金招聘Python工程师标准>>> hello 转载于:https://my.oschina.net/mrpei123/blog/1605391

F5与NetScaler比较

F5 是基于Linux的&#xff0c;NetScaler 是基于BSD的。F5 的四层走的是硬件芯片&#xff0c;七层走的是软件&#xff0c;NetScaler 全部走的是软件。我测试的性能也是 F5比NetScaler强&#xff0c;在均不使用压缩的情况下&#xff0c;NetScaler比F5消耗更大的带宽。

这个机器狗引起网友争议,「持枪机器狗」射程达1200米

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 如果提起自动机器狗&#xff0c;首先想到的应该是波士顿动力&#xff0c;自波士顿动力 Spot 推出以来&#xff0c;机器狗就解锁了很多应用场景。波士顿动力一直都禁止将机器狗武器化。 但是&#xff0c…

nutch如何发布插件

为什么80%的码农都做不了架构师&#xff1f;>>> 1.修改插件&#xff0c;在原有的插件上修改&#xff0c;比如parse-html插件上修改。 2.修改插件之后&#xff0c;把第三方的包放到/nutch/runtime/local/lib下&#xff08;经测试&#xff0c;只有在此目录下&#xf…

第 7 章 项目运作

comments powered by Disqus 原文出处&#xff1a;Netkiller 系列 手札 本文作者&#xff1a;陈景峯 转载请与作者联系&#xff0c;同时请务必标明文章原始出处和作者信息及本声明。

干货!整理了50个 Pandas 高频使用技巧,强烈建议收藏!

作者 | 俊欣来源 | 关于数据分析与可视化今天小编来分享在pandas当中经常会被用到的方法&#xff0c;篇幅可能有点长但是提供的都是干货&#xff0c;读者朋友们看完之后也可以点赞收藏&#xff0c;相信会对大家有所帮助&#xff0c;大致本文会讲述这些内容DataFrame初印象读取表…

CentOS的Gearman安装与使用无错版

通常&#xff0c;多语言多系统之间的集成是个大问题&#xff0c;一般来说&#xff0c;人们多半会采用WebService的方式来处理此类集成问题&#xff0c;但不管采用何种风格的WebService&#xff0c;如RPC风格&#xff0c;或者REST风格&#xff0c;其本身都有一定的复杂性。相比之…

putty或xshell上用vi/vim小键盘无法使用的解决方法

在putty或xshell上用vi/vim的时候&#xff0c;开NumLock时按小键盘上的数字键并不能输入数字&#xff0c;而是出现一个字母然后换行(实际上是命令模式上对应上下左右的键)。解决方法&#xff1a;putty&#xff1a;选项Terminal->Features里&#xff0c;找到Disable applicat…

Sqoop数据分析引擎安装与使用

Sqoop数据分析引擎安装与使用>什么是Sqoop ?Sqoop 是一个开源的数据处理引擎&#xff0c;主要是通过 JDBC 为媒介&#xff0c; 在Hadoop&#xff08;Hive&#xff09;与 传统的关系型数据库(Oracle, MySQL,Postgres等)间进行数据的传递HDFS Hive HBase < JD…

《独辟蹊径品内核:Linux内核源代码导读(china-pub首发)》的前言

我觉得作者讲的学习方法很好值得看看。 下面是本书作者所写&#xff1a; 几乎每一个操作系统内核的学习者在初学阶段都会感觉到难以入门。这是由于内核涉及到知识面非常广泛&#xff0c;需要学习者从根本上掌握大量的知识&#xff0c;这包括&#xff1a;程序编译&#xff0c;链…

95后架构师晒出工资单:狠补了这个,真香...

经常会有很多人说&#xff1a;“不是谁都可以成为架构师的。”“我们公司用的就是那点东西&#xff0c;不需要会太多。”“技术够用就行了。”…其实他们说的不错&#xff0c;但我也总觉得&#xff0c;程序员可以是一个非常热血的职业。即使不是人人都可以成为架构师&#xff0…

趣味图形之 余弦函数cos与直线相交(另一种相交)

高中的时候做的&#xff0c;前两天看了看&#xff0c;挺好玩的。只想说&#xff0c;当初的代码风格&#xff0c;&#xff0c;&#xff0c;&#xff0c;咳咳&#xff0c;算不上风骚&#xff01;#include <math.h> #include <stdio.h> int main (void) {double y;int…

AI时代:推荐引擎正在塑造人类

We shape our tools and afterwards our tools shape us. ------Marshall McLuhan 麦克卢汉说&#xff1a;“我们塑造了工具&#xff0c;反过来工具也在塑造我们。” 我本人不反感AI&#xff0c;也相信人工智能会开创一个伟大的时代&#xff0c;但是我们要思考一些东西&#xf…