请问如何拦截hibernate的load(userId)操作?

xishanlang2001 2009-01-15 10:37:51
我想在hibernate之前加一个自己的数据缓存层,而不用hibernate自身的缓存,或第三方(如ehchace,原因多多).
可不知道表关联如何处理,如果user和city关联,只要在配置文件里设置好了。user.getCity,即可得到相应的city.
但是,我希望的是,如果该city已经在数据缓存池内存在了,则去缓存池里取,而不要从数据库里读取.

请问hibernate.Interceptor能实现这个功能吗?

小弟想实现的功能是:
当hibernate底层load(key)的时候,拦截一下,如果我自己的缓存池里已经有这个key对象了,则阻止hibernate向数据库查询,并且返回相关的对象;如果没有,则由hibernate执行查询,并将查询的结果,按key存入数据缓存池.
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kukufly 2009-02-01
  • 打赏
  • 举报
回复
学习 帮你顶了
xishanlang2001 2009-02-01
  • 打赏
  • 举报
回复
多谢大家指点!
听高手说,hibernate的拦截器,也是基于AOP的,请问是这样吗?

我使用了hibernate自带拦截器的 getEntity方法.
似乎确实能拦截到.这样对效率有什么影响吗?
xishanlang2001 2009-01-15
  • 打赏
  • 举报
回复
补充说明一下.
小弟不想使用hibernate自身的缓存,或使用第三方的缓存,实在是出于无奈.

比如说,hibernate每次读取一个对象,都是对象的复本,而非直接引用.
User u1 = load(userId);
User u2 = load(userId);
System.out.println(u1==u2);// false
再者,hibernate每次写操作,都不是先进缓存,定时回写数据库.而对我目前想设计的系统(是一个游戏)而言,存大频繁的写操作,但又不是急迫需要立即写入的.如果自己作一个缓存池,则比较符合需求.

如果仅是单表load(userId),那么直接在这一层作一下手脚就可以了.
不过,hibernate提供了强大的表关联操作嘛:D,所以就想使用他这个功能.
比如user和city关联,那么在user里写好了配置,
User u = .....;
City c = u.getCity();
就可以使用c了,无需要关心user表.city_id是多少,以及city.id是多少.

请大家多多指教!
yunyouyou 2009-01-15
  • 打赏
  • 举报
回复
学习,用spring可能可以搞定,,
z收获 2009-01-15
  • 打赏
  • 举报
回复
学习中,支持!!
MatrixII 2009-01-15
  • 打赏
  • 举报
回复
自己做缓存可以考虑使用AOP机制来实现。如果是用Spring框架的可以参考Spring框架中有关AOP的内容。或者使用AspectJ
fulianglove 2009-01-15
  • 打赏
  • 举报
回复
拦截好像没用吧,拦截load方法你只能在方法执行,执行后进行一些自己的操作,但方法内部还是该怎么执行就怎么执行啊。
你看看能不能模范hibernate里针对ehcache的EhCacheProvider 来开发针对你自己的缓冲层的provider。
然后在hibernate配置文件里可以进行配置,这样应该可以实现你的意图

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧