五、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");
相关推荐
前端开源库-markdown-it-lazy-headersMarkdown it Lazy Headers,Lazy ATX Headers插件用于Markdown it
Laravel开发-eloquent-log-lazy-loading 记录(或禁用)雄辩的延迟加载关系。
一个组件实现lazyload图片当在视窗内(或附近)时才加载
npm install babel-plugin-syntax-dynamic-lazy-import --save-dev 用法 通过.babelrc或babel-loader。 { " plugins " : [ " syntax-dynamic-lazy-import " ] } 例子 const component = lazyImport ( './xx.js' , ...
基于lazy-snapping的图片分割代码
适用于vanilla-lazyload的lazyload-vue Vue插件构建状态:功能可与v-lazy-src轻松使用接受选项Vue.use(LazyloadVue,options)适用于vanilla-lazyload的Multipl lazyload-vue Vue插件构建状态:功能可与v-lazy轻松...
lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64
这是react-lazy-load-image-component NPM 包的演示。 它既不打算在现实生活中使用,也不是好的编程实践的一个例子,而是要给出一个如何使用包react-lazy-load-image-component及其道具的例子。 观看现场演示: : ...
前端项目-vanilla-lazyload,Lazyload是一个快速、轻量级和灵活的脚本,仅在图像即将进入可滚动区域的视区时才加载图像,并对渐进式JPEG图像格式提供了极好的支持。类型脚本模块定义可用。
hexo-lazyload-image hexo-lazyload-image是一个hexo插件,用于使所有图像自动支持lazyload。 借助此功能,它将改善很多加载性能。 所有延迟加载图像仅在它们位于当前视口内时显示。 不必担心lazyload SEO问题,因为...
注:LazyImg 必须定义lazy-data属性,属性值是src的图片路径 引入JS文件:<script type="text/javascript" src="js/lazyImg.v1.0.js"> 默认情况下: 在IMG中满足以任何一个条件,都会加载图片; 1、没有class属性 2...
OnsenUI-LazyRepeat(无限滚动) ons-lazy-repeat 功能的示例。 。 有关 Lazy Repeat 的更多信息。
下面小编就为大家带来一篇浅谈spring中的default-lazy-init参数和lazy-init。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
React本征懒指标 react-native-lazy-index是RAM捆绑包友好的,捆绑包时生成的index.js 。 通过仅加载将按需使用的功能来缩短应用程序启动时间。 有关RAM捆绑包和内联需求的信息,请参见 。 如果您使用 ,还请查看其...
今天起床,拿起手机开机第一时间当然是打开微信了,左右滑动Viewpager,发现它使用了一种叫惰性加载,或者说懒加载(lazy-loading)的方式加载Viewpager中的Fragment。效果如图: 什么是lazy-loading呢?顾名思义...
cortex-m4f-lazy-stacking-and-context-switching.pdf
懒惰的图像用于延迟加载图像的轻量级 javascript 插件用安装模块: npm install lazy-images需要模块: var lazy = require('lazy-images')([IMAGE_SELECTOR]);IMAGE_SELECTOR 默认为“.lazy”笔记为了让这个模块...
Generator Lazy Demo 跟着例子在3分钟内玩转Generator Lazy。 Useage 向导模式创建 在任意目录中执行yo lazy,然后一路NEXT即可。 在包含配置文件的项目中使用 命令: yo lazy cd build-with-config-exist yo lazy 在...
懒人画家 用于SVG路径动画的现代JS库 | 入门 根据快速入门说明,可以轻松完成Lazy Line Painter的设置。 但是,如果您更需要GUI,请确保使用 。 专为SVG路径动画开发的免费...import LazyLinePainter from 'lazy-l
react-lazyimg-component react-lazyimg-component v1.0.0 是使用 、、完全重构的,React 图片懒加载小组件。并且组件参考了 动画实现原理 ,引入全新的渐进性自然过渡效果(如下图 方案 B 所示)。 Demo 效果 ...