`

hibernate学习笔记第12讲-lazy策略

阅读更多

 

Hibernate lazy策略:延迟加载、懒加载。

代理的概念:只有真正使用该对象的时候才会创建。

Lazyhibernate:在真正使用的时候才会发出sql查询。

实现原理:采用第三方库cglib,对类生成代理类。代理可以控制源对象,并且可以对源对象的功能进行增强。

Cglibjdk动态代理的区别:

1,cglib能够对类进行代理,jdk动态代理只能对实现了接口的类进行代理。

2,Jdk动态代理类和原类实现相同的接口

3,Cglib 代理类继承原类,生成一个子类。

 

Lazyhibernate中的使用地方:可以取值truefalse

* <class>标签,可以取值truefalse。默认为true

* <property> 标签,可以取值truefalse。很少用。

* 集合<set><list>,可以取值truefasleextra。默认为true

* <one-to-one> <many-to-one> 单端关联上,可以取值falseproxynoproxy。默认proxy

Load支持lazyget不支持lazy。并且Load的时候只会加载普通属性,集合不会加载

Lazy的生命周期跟session一样,session关闭,lazy也失效。

 

Class上的lazy策略:影响的范围是普通属性的加载,对集合不起作用。

session.beginTransaction();

                            //不会发出sql

                            Group group = (Group)session.load(Group.class, 1);

                            //不会发出sql

                            System.out.println("group.id=" + group.getId());

                            //会发出sql

                            System.out.println("group.name=" + group.getName());

                            session.getTransaction().commit();

Group group = null;

                   try {

                            session = HibernateUtils.getSession();

                            session.beginTransaction();

                            group = (Group)session.load(Group.class, 1);

                            session.getTransaction().commit();

                   }catch(Exception e) {

                            e.printStackTrace();

                            session.getTransaction().rollback();

                   }finally {

                            HibernateUtils.closeSession(session);

                   }

                  

                  //不能正确输出,抛出LazyInitializationException 异常,因为session已经关闭

                   //hibernate支持lazy策略只有在session打开状态下有效

                   System.out.println("group.name=" + group.getName());

 

集合上的lazy:建议使用extra,因为会发出智能sql

session.beginTransaction();

                            //不会发出sql

                            Classes classes = (Classes)session.load(Classes.class, 1);

                            //会发出sql

                            System.out.println("classes.name=" + classes.getName());

                            //不会发出sql

                            Set students = classes.getStudents();

                            //会发出sql

                            for (Iterator iter=students.iterator(); iter.hasNext();) {

                                     Student student = (Student)iter.next();

                                     System.out.println("student.name=" + student.getName());

                            }

                            session.getTransaction().commit();

设置<class>标签上的lazy=false

session.beginTransaction();     

                            //会发出sql

                            Classes classes = (Classes)session.load(Classes.class, 1);

                            //不会发出sql

                            System.out.println("classes.name=" + classes.getName());

                            //不会发出sqlclass上的lazy不影响集合

                            Set students = classes.getStudents();

                            //会发出sql

                            for (Iterator iter=students.iterator(); iter.hasNext();) {

                                     Student student = (Student)iter.next();

                                     System.out.println("student.name=" + student.getName());

                            }

                            session.getTransaction().commit();

设置集合上的lazy=false,默认为true

session.beginTransaction();

                            //不会发出sql

                            Classes classes = (Classes)session.load(Classes.class, 1);

                            //会发出sql,会发出两条sql分别加载ClassesStudent

                            System.out.println("classes.name=" + classes.getName());

                            //不会发出sql

                            Set students = classes.getStudents();

                            //不会发出sql

                            for (Iterator iter=students.iterator(); iter.hasNext();) {

                                     Student student = (Student)iter.next();

                                     System.out.println("student.name=" + student.getName());

                            }

                            session.getTransaction().commit();

设置集合上的lazy=extra

1,跟lazy=true效果一样。

session.beginTransaction();

                            //不会发出sql

                            Classes classes = (Classes)session.load(Classes.class, 1);

                            //会发出sql

                            System.out.println("classes.name=" + classes.getName());

                            //不会发出sql

                            Set students = classes.getStudents();

                            //会发出sql

                            for (Iterator iter=students.iterator(); iter.hasNext();) {

                                     Student student = (Student)iter.next();

                                     System.out.println("student.name=" + student.getName());

                            }

                            session.getTransaction().commit();

2,发出智能sql

session.beginTransaction();

                            //不会发出sql

                            Classes classes = (Classes)session.load(Classes.class, 1);

                            //会发出sql

                            System.out.println("classes.name=" + classes.getName());

                            //不会发出sql

                            Set students = classes.getStudents();

                            //会发出sql,发出一条比较智能的sql,直接发出count()sql

                            System.out.println("student.count=" + students.size());

                            session.getTransaction().commit();

单端关联上的lazy:可以取值falseproxynoproxy,默认proxynoproxy采用字节码,需要增强工具支持。

单端关联上默认lazy属性:跟集合一样

session.beginTransaction();

                            //不会发出sql

                            User user = (User)session.load(User.class, 1);

                            //会发出sql

                            System.out.println("user.name=" + user.getName());

                            //不会发出sql

                            Group group = user.getGroup();

                            //会发出sql

                            System.out.println("group.name=" + group.getName());

                            session.getTransaction().commit();

单端关联上lazy=false:跟集合一样

session.beginTransaction();

                            //不会发出sql

                            User user = (User)session.load(User.class, 1);

                            //会发出sql,发出两条sql分别加载UserGroup

                            System.out.println("user.name=" + user.getName());

                            //不会发出sql

                            Group group = user.getGroup();

                            //不会发出sql

                            System.out.println("group.name=" + group.getName());

                            session.getTransaction().commit();

classlazy=fasle,单端关联上lazy=proxy

class上的lazy 不会影响到单端关联上的lazy

                           session.beginTransaction();

                            //会发出sql

                            User user = (User)session.load(User.class, 1);

                            //不会发出sql

                            System.out.println("user.name=" + user.getName());

                            //不会发出sql

                            Group group = user.getGroup();

                            //会发出sql

                            System.out.println("group.name=" + group.getName());

                            session.getTransaction().commit();

 

分享到:
评论

相关推荐

    前端项目-vue-lazyload.zip

    Vue-lazyload 就是一个专为 Vue.js 应用程序设计的插件,它允许我们按需加载图片,从而提高应用性能。 Vue-lazyload 插件主要解决了以下问题: 1. **减少网络资源请求**:传统方式下,所有图片都会在页面加载时...

    前端开源库-markdown-it-lazy-headers

    Markdown-it-Lazy-Headers是前端开发领域的一个开源库,专门针对Markdown解析器Markdown-it设计的一款插件。这个插件的主要功能是实现"懒惰式"的ATX风格标题处理,也就是所谓的"Lazy ATX Headers"。在Markdown语法中...

    前端项目-vanilla-lazyload.zip

    前端项目-vanilla-lazyload,Lazyload是一个快速、轻量级和灵活的脚本,仅在图像即将进入可滚动区域的视区时才加载图像,并对渐进式JPEG图像格式提供了极好的支持。类型脚本模块定义可用。

    前端项目-jquery-lazyload-any.zip

    《前端项目中的jQuery LazyLoad Any技术详解》 在前端开发中,优化网页加载速度和用户体验是至关重要的。jQuery LazyLoad Any是一个高效的插件,专为延迟加载图像、iframe或者其他任何元素而设计,它大大提升了页面...

    前端开源库-mocha-lazy-bdd

    Mocha-Lazy-BDD则是一个针对Mocha的扩展,它引入了RSpec(Ruby测试框架)的风格,特别是"let"和"subject"这两个宏,旨在为使用ES5语法的项目提供更加便捷的测试体验。 1. **Mocha框架基础** Mocha是一款灵活的、...

    react-lazy-load-image-component-demo:react-lazy-load-image-component 演示

    这是react-lazy-load-image-component NPM 包的演示。 它既不打算在现实生活中使用,也不是好的编程实践的一个例子,而是要给出一个如何使用包react-lazy-load-image-component及其道具的例子。 观看现场演示: : ...

    前端开源库-lazy-dependable

    这种策略显著减少了首次加载页面所需的时间,提高了用户体验,尤其是在处理大型或资源密集型应用时。 二、依赖解析 在JavaScript中,依赖管理是组织代码和确保正确执行顺序的关键部分。lazy-dependable 库提供了一...

    vue-lazyload使用总结(推荐)

    2. 检查Vue-Lazyload的配置,如占位符设置、错误处理策略等。 3. 如果有其他插件也监听滚动事件,可能需要调整事件处理的顺序或使用Vue的`nextTick`方法确保Vue-Lazyload在适当的时间执行。 总的来说,Vue-Lazyload...

    vue-lazy-hydration:服务器端呈现的Vue.js组件的惰性水合

    vue-lazy-hydration是一个无渲染的Vue.js组件,用于改善服务器端渲染的Vue.js应用程序的估计输入延迟和交互时间。 这可以通过使用惰性水合延迟预渲染HTML的水合来实现。 安装 npm install vue-lazy-hydration ...

    react-lazy-load, 当子元素进入viewport时,响应它们呈现子元素.zip

    react-lazy-load, 当子元素进入viewport时,响应它们呈现子元素 延迟加载 组件反应 延迟加载 很容易使用响应组件,它帮助你以可以预测的方式延迟加载内容。 速度快,工作在 IE8+,6KB 缩小,在默认情况下使用去抖...

    hibernate学习笔记

    Hibernate 是一个开源的对象关系映射框架,它允许开发者将Java对象和关系数据库的数据进行映射,从而简化数据库操作。在本篇文章中,我们将深入探讨 Hibernate 的核心概念和使用方法。 首先,创建 Hibernate 项目的...

    hqy-lazyload:一种快速,轻量级的纯JavaScript脚本,用于延迟加载和提供多张图片,iframe,视频等内容

    hqy-lazyload 一个轻量级的纯JavaScript脚本,用于延迟加载和多服务图像。 它可以在包括IE7 +在内的所有现代浏览器中使用。 它是用纯JavaScript编写的,因此它不依赖于jQuery之类的第三方库。 它使您可以延迟加载...

    Hibernate3.2学习笔记

    本篇学习笔记将深入探讨Hibernate3.2的核心概念,包括环境搭建、主要接口、映射方式以及性能优化策略。 首先,让我们从搭建Hibernate3.2开发环境开始。在创建一个新的Java项目后,我们需要添加必要的库文件,主要...

    SSH笔记-检索策略(lazy、fetch、batch-size)

    本笔记将聚焦于Hibernate中的类级别检索策略以及`lazy`、`fetch`和`batch-size`这三个属性的使用,帮助开发者更高效地管理数据库查询。 1. **懒加载(Lazy Loading)** `lazy`属性是Hibernate的懒加载机制,用于...

    pytest-lazy-fixture:有助于在pytest.mark.parametrize中使用固定装置

    pytest-lazy-fixture是Python测试框架pytest的一个插件,它主要解决了在使用`pytest.mark.parametrize`装饰器时,如何方便地引入和使用固定装置(fixture)的问题。在pytest中,固定装置是一种重用测试环境的方法,...

    hibernate在集合上的lazy策略

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,它允许我们推迟对关联对象的加载,直到真正需要它们的时候。标题“hibernate在集合上的lazy策略”指的是Hibernate如何处理与实体相关的集合...

    Laravel开发-laravel-lazy-mysql

    在Laravel框架中,"laravel-lazy-mysql"是一个关于使用懒加载(Lazy Loading)技术来优化MySQL数据库操作的实践。懒加载是一种延迟加载策略,它只在真正需要数据时才执行数据库查询,以此提高应用程序的性能和效率。...

    Node.js-一个组件实现lazyload图片当在视窗内(或附近)时才加载

    标题:“Node.js-一个组件实现lazyload图片当在视窗内(或附近)时才加载” 在Web开发中,性能优化是一项至关重要的任务。随着网站内容的丰富,图片资源占据了很大一部分,如果不加以优化,可能会导致页面加载速度慢...

    vue-lazyload-source-code:学习vue-lazyload源代码-vue source code

    $ npm i vue-lazyload -S CDN CDN: : &lt; script src =" https://unpkg.com/vue-lazyload/vue-lazyload.js " &gt; &lt;/ script &gt; &lt; script &gt; Vue . use ( VueLazyload ) . . . &lt;/ script &gt; ...

Global site tag (gtag.js) - Google Analytics