`
yu120
  • 浏览: 81537 次
社区版块
存档分类
最新评论

⑤BuguMongo---lazy和cascade属性

阅读更多

五、lazy和cascade属性

lazy属性

查询数据的时候,有些字段并不需要返回。这样能够节省内存,而且取数据的速度会更快一些。

虽然BuguQuery查询中的方法returnFields()和notReturnFields(),可以指定查询的时候返回、不返回哪些字段,但如果每次查询的时候都要特别指定,那会非常麻烦。有没有简便一点的方法呢?用lazy属性即可实现。

@Property、@Embed、@EmbedList都有lazy属性,其缺省值都是false。

如果把lazy设为true,那么表示:当取出一个List的时候,不会把lazy=true的属性取出来。

如果是取单条记录,会把这条记录的所有field都取出来,不管该field是否为lazy。也就是说,lazy属性只对取列表的时候起作用。

以一个简单的新闻系统为例:

@Entity
public class News implements BuguEntity{
    @Id
    private String id;
    private String title;  //新闻标题
    @Property(lazy=true)
    private String content;  //新闻内容

    @Override
    public String getId(){
        return id;
    }

    @Override
    public void setId(String id){
        this.id = id;
    }

    ...getter and setter...
    
}
public class NewsDao extends BuguDao{
    public NewsDao(){
        super(News.class);
    }}

新闻的内容,是很长的字符串。而显示新闻列表的时候,并不需要把新闻内容取出来。

NewsDao dao =new NewsDao();
List<News> list = dao.query().pageNumber(1).pageSize(100).results();  
//取出100条新闻,用于列表显示

因为content上的@Property注解,把lazy设为了true,因此,并没有把content字段从数据库中取出来,list里面每个News的content,值为null。

fetchLazy()

在某些特殊的应用场合,对于设置了lazy=true的属性,仍然希望它能够在列表中显示。这时候,可以使用辅助工具类BuguMapper中的fetchLazy()方法:

NewsDao dao =new NewsDao();
List<News> list = dao.query().pageNumber(1).pageSize(100).results();  
//News中不包含lazy=true的字段
BuguMapper.fetchLazy(list);  
//现在,lazy=true的字段也被取出来了

fetchLazy()方法虽然用起来很方便,但它是以牺牲性能为代价的,因此,除非特殊情况,否则不要使用它。

cascade属性

@Ref、@RefList都有cascade属性,其缺省值都是空字符串"",表示不做任何关联操作。

通过设置cascade属性,可以关联CRUD操作,给编写程序带来很大的方便。

例:

@Entity
public class Foo implements BuguEntity{
    @Id
    private String id;
    private String name;
    @Ref
    private Father father;

    ...getter and setter...
}
@Entity
public class Father implements BuguEntity{
    @Id
    private String id;
    private String name;

    ...getter and setter...
}

这里,没有设置任何关联操作。因此,向MongoDB中插入foo的时候,无法关联插入father。只能分别创建,如下:

 

FooDao fooDao =...
FatherDao fatherDao =...
Father father =new Father();
father.setName("John");
fatherDao.insert(father);  //先保存
fatherFoo foo =new Foo();
foo.setName("Frank");
foo.setFather(father);
fooDao.insert(foo);  //再保存foo

如果设置成

关联创建,如下:

@Ref(cascade="C")
private Father father;

那么,创建foo的同时,会关联创建father。

FooDao fooDao =...Father father =new Father();
father.setName("John");Foo foo =new Foo();
foo.setName("Frank");
foo.setFather(father);
fooDao.insert(foo);  //会关联保存father

cascade的含义

结合上面的例子,cascade的CRUD含义如下:

关联创建——cascade的值中包含字符“C”。当向MongoDB中插入foo的时候,如果father没有还没有被保存到数据库中,则会关联创建。

关联读取——cascade的值中包含支付“R”。当从数据库中取出foo的时候,会关联取出father对象。

关联修改——cascade的值中包含字符“U”。当保存foo的时候,如果father发生了变化,则会关联保存该变化。

关联删除——cascade的值中包含字符“D”。当删除foo的时候,同时会删除father对象。

对于用@RefList标注的属性,也是和@Ref一样的含义。

当关联取出@RefList注解标注的属性时,会根据注解上的sort属性进行排序。

fetchCascade()

如果没有设置关联读取,即,cascade值中不包含“R”字符,那么,对@Ref、@RefList注解的实体,只有id值,其它值均为null。

以上面的代码为例,如果father属性没有设置关联读取,

@Ref
private Father father;

那么,

Foo foo =(Foo)fooDao.query().is("id","4eccbea26c02f26351e56bcc").result();
Fahter father = foo.getFather();
String id = father.getId();  //有值
String name = father.getName();  //值为null

如果改为:

@Ref(cascade="R")
private Father father;

则father.getName()不为null。

对于没有设置关联读取的@Ref和@RefList属性,如果在某些情况下却又需要用到该属性,那么,可以使用BuguMapper类的fetchCascade()方法,把该属性关联取出。如:

 

Foo foo =(Foo)fooDao.query().is("id","4eccbea26c02f26351e56bcc").result();
BuguMapper.fetchCascade(foo,"father");  //关联取出father属性
Fahter father = foo.getFather();
String id = father.getId();  //有值
String name = father.getName();  //有值
List list = fooDao.query().pageNumber(1).pageSize(50).results();
BuguMapper.fetchCascade(list,"father");  //关联取出list中每个foo的father属性。

当用fetchCascade()方法取出@RefList注解标注的属性时,会根据注解上的sort属性进行排序。

fetchCascade()方法可以一次关联取出多个@Ref、@RefList属性,如下:

BuguMapper.fetchCascade(list,"father","children");

fetchCascade()方法还支持多级关联,可以一级一级往下取,例如:

BuguMapper.fetchCascade(list,"father.father");
分享到:
评论

相关推荐

    lazy-snapping--master.zip_lazy-snapping

    1. "Jumping-on-the-water-lazysnapping.bmp" 和 "twin-skimmer-lazysnapping.bmp" 可能是使用lazy-snapping算法处理过的示例图像,它们的原始版本为 "Jumping-on-the-water.jpg" 和 "twin-skimmer.jpg",这可能用于...

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

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

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

    `react-lazy-image-master`这个压缩包文件很可能是包含了一个实现懒加载图片功能的React组件示例。通常,这样的组件会依赖于Intersection Observer API,这是一个浏览器原生API,用于检测元素是否进入或离开视口。...

    babel-plugin-syntax-dynamic-lazy-import:根据需要加载模块

    npm install babel-plugin-syntax-dynamic-lazy-import --save-dev 用法 通过.babelrc或babel-loader。 { " plugins " : [ " syntax-dynamic-lazy-import " ] } 例子 const component = lazyImport ( './xx.js' , ...

    lazy-line-painter:Lazy Line Painter-用于SVG路径动画的现代JS库

    懒人画家 用于SVG路径动画的现代JS库 | 入门 根据快速入门说明,可以轻松完成Lazy Line Painter的设置。 但是,如果您更需要GUI,请确保使用 。 专为SVG路径动画开发的免费...import LazyLinePainter from 'lazy-l

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

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

    lazyload-vue-用于香草lazyload的Vue插件。-Vue.js开发

    适用于vanilla-lazyload的lazyload-vue Vue插件构建状态:功能可与v-lazy-src轻松使用接受选项Vue.use(LazyloadVue,options)适用于vanilla-lazyload的Multipl lazyload-vue Vue插件构建状态:功能可与v-lazy轻松...

    浅谈spring中的default-lazy-init参数和lazy-init

    浅谈Spring中的default-lazy-init参数和lazy-init 在Spring框架中,有两个重要的参数default-lazy-init和lazy-init,它们都是用于控制Bean实例化的时机的。下面我们将详细介绍这两个参数的作用和区别。 一、...

    Laravel开发-eloquent-log-lazy-loading

    本话题主要关注Eloquent中的一个特性——延迟加载(lazy loading)以及如何记录或禁用它。延迟加载是一种优化策略,用于在需要时才加载关联的数据,而不是在查询时一次性加载所有数据,以此来提高性能。 1. Eloquent...

    cortex-m4f-lazy-stacking-and-context-switching.pdf

    Cortex-M4(F) Lazy Stacking 和 Context Switching 本文档主要介绍了 ARM Cortex-M4(F) 处理器的 Lazy Stacking 和 Context Switching 机制。Lazy Stacking 是一种优化的堆栈管理机制,用于减少 Context Switching ...

    lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64

    lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64

    前端项目-vanilla-lazyload.zip

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

    OnsenUI-LazyRepeat:ons-lazy-repeat 功能示例

    3. **使用`ons-lazy-repeat`**:在`&lt;ons-list&gt;`或`&lt;ons-list-item&gt;`标签上添加`ons-lazy-repeat`属性,并将其值设置为一个函数,该函数会返回一个对象,这个对象通常包含`itemHeight`(每个列表项的高度)和`...

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

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

    edge-magento-module-lazyload:外缘的Magento延迟加载产品模块

    安装和配置"edge-magento-module-lazyload"模块时,需要修改Magento的布局文件(XML),可能还需要定制一些CSS和JavaScript,以适应网站的现有样式和交互。 在"edge-magento-module-lazyload-master"这个压缩包中,...

    lazy-images:懒加载图片

    懒惰的图像用于延迟加载图像的轻量级 javascript 插件用安装模块: npm install lazy-images需要模块: var lazy = require('lazy-images')([IMAGE_SELECTOR]);IMAGE_SELECTOR 默认为“.lazy”笔记为了让这个模块...

    react-native-lazy-index:RAM捆绑友好,捆绑时生成的`index.js`

    React本征懒指标 react-native-lazy-index是RAM捆绑包友好的,捆绑包时生成的index.js 。 通过仅加载将按需使用的功能来缩短应用程序启动时间。 有关RAM捆绑包和内联需求的信息,请参见 。 如果您使用 ,还请查看其...

    前端项目-vue-lazyload.zip

    Vue.js 是一款非常流行的前端JavaScript框架,用于构建用户界面。Vue.js 的核心理念是通过声明式的数据绑定和组件化来...在压缩包文件`vue-lazyload-master`中,包含了源码和示例,可以帮助你深入理解和使用这个插件。

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

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

    Android仿微信Viewpager-Fragment惰性加载(lazy-loading)

    今天起床,拿起手机开机第一时间当然是打开微信了,左右滑动Viewpager,发现它使用了一种叫惰性加载,或者说懒加载(lazy-loading)的方式加载Viewpager中的Fragment。效果如图: 什么是lazy-loading呢?顾名思义...

Global site tag (gtag.js) - Google Analytics