发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 云架构 框架 开发教程 SOA 大数据 扩展性 并发编程 EDA 分布式 函数编程

关于Jdon框架和Hibernate的整合,Banq大哥请进

    
2009-08-08 14:39
赞助商链接

之前我发过一个帖子,见http://www.jdon.com/jivejdon/thread/36736.html
弄了N久,终于弄明白了.
问题是could not initialize proxy - no Session,我一直以为是CloseSessionInViewFilter出了问题,导致还没到View层Session就关闭了,后来发现不是这个原因,真正的原因是Jdon的缓存和Hibernate的懒加载一起用才发生了错误.
说明:
一对多的关联.
第一个请求我取出"一"的时候,"一"中的多是没有从数据库中加载的,然后显示到页面,之后CloseSessionInViewFilter把这个Session给关了,还没完,同时Jdon的缓存机制将这个"一"给缓存了.
接下来第二个请求我要显示详细的"一",也就是说还要取出这个"一"中的"多",我getService(),然后
Big big=service.getBig(id)
再然后我还要里面的"多"
Smalls smalls=big.getSmalls();
问题出来了could not initialize proxy - no Session.
问题就在于这个big对象是从Jdon的缓存中得到的,Jdon并没有去查数据库,因为Jdon的缓存中有,于是返回了big,但是当我getSmalls()是就一定会报错了,因为这个big中根本就没有smalls啊,只是个代理.
然后我就查Jdon的使用手册,在Model中设置
setCacheable(false);
之后问题就解决了.
我没有用到Jdon的CRUD功能.用到了分页查询.
我现在想的是,用了Hibernate就不能Jdon自带的缓存了吗?

Banq大哥看下,我说的有没有错.谢谢啦~

2009-08-08 17:20

你说的非常正确,是这个道理。

Jdon缓存是保存的完整领域模型,包括其边界内所有的之对象,Jdon缓存的目的是提供模型对象一个新的生存空间:内存。

而Hibernate需要照顾数据库的,所以提供一个懒加载技术手段,而我认为:如果根据Evans DDD设计正确领域模型及其根对象和边界后,就无需懒加载了,也就是说:我认为懒加载是一个在没有好的设计前提下,迫不得已的办法。

懒加载的不透明性还增加了技术操作的复杂性,这是实践证明的。
第一步:
你可以先用Hibernate的二级缓存,失效Jdon缓存
第二步:
当你学会DDD,建模以后,就可以使用Jdon缓存。当然,Hibernate的二级缓存就可用可不用了。

2009-08-08 18:11

谢谢Banq大哥,我只好先用Hibernater的二级缓存而放弃Jdon的缓存了.
我一直都觉得DDD是个很令人激动的东西,可就是弄不明白,Banq大哥以前的帖子上说跟着Jdon框架走就慢慢能弄明白DDD了,可现在还是很迷惑.

JdonFramework     

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com