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

09-08-08 frogprince
之前我发过一个帖子,见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大哥看下,我说的有没有错.谢谢啦~

    

banq
2009-08-08 17:20
你说的非常正确,是这个道理。

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

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

懒加载的不透明性还增加了技术操作的复杂性,这是实践证明的。

第一步:

你可以先用Hibernate的二级缓存,失效Jdon缓存

第二步:

当你学会DDD,建模以后,就可以使用Jdon缓存。当然,Hibernate的二级缓存就可用可不用了。

frogprince
2009-08-08 18:11
谢谢Banq大哥,我只好先用Hibernater的二级缓存而放弃Jdon的缓存了.

我一直都觉得DDD是个很令人激动的东西,可就是弄不明白,Banq大哥以前的帖子上说跟着Jdon框架走就慢慢能弄明白DDD了,可现在还是很迷惑.

猜你喜欢