Jfinal 一对多,如何拒绝懒加载

以手册中一对多的User表 和 Blog表为例;

User的model中

public List<Blog> getBlogs(){

    return find("select * from blog where userId=?",get("userId"));

}


场景: 处理User集合中的Blogs(假设而已)

List<User> users = new User().dao().findUsersByState();

for(User u : users){

    u.getBlogs();//这里   已经是在循环查库了.

}

我需要他查出来后就要把Blogs 封装好.  怎么破?  重写_getAttrs() 

@Overrideprotected Map<String, Object> _getAttrs() {    Map<String, Object> attr = super._getAttrs();    if(attr.size() > 0){        attr.put("blogs",getBlogs());    }    return attr;}userId 取不到attr size 为0

群里 波总有回复 :

image.png

给了一个解决方案.

其实使用_getAttrs 先不说成功不成功,  都是在骗自己.始终是在循环查库. 

感觉波总的这个方案,也是一样的效果,还是需要循环查.

一个一对多的属性,可以主动查.  2个一对多的属性就牵强了.

另外 ,  我想象中的 贪婪加载  是在一个Jdbc connection 中 完成 加载任务,  而不是 多次的打开 闭合 数据库连接. 然而 不想循环查库的原因就是不想多次的创建闭合Conn.



-----------------------------------------------------------

结论:   出现上类问题后, 脑短路, 忽略了一个重要问题.  连接池.  回头翻了翻Hibernate  Mybatis  和Jfinal的代码.   没有不使用连接池 ,都是使用连接池来管理connection的.   循环查库的影响.以我的场景可以忽略

评论区

HingLo

2018-08-01 08:52

你可以查询两次(查询一次一,在查询一次多),通过业务层来组装。我一般这么干的,降低了频繁查询数据库。

大Z

2018-08-01 10:40

@HingLo thk 是自己脑短路了. 实际上 问题早已被连接池处理.

热门反馈

扫码入社