Joh*_*erg 86 java spring hibernate lazy-loading application-design
我倾向于将Hibernate与Spring框架结合使用,并使用声明式事务划分功能(例如@Transactional).
众所周知,hibernate试图尽可能地非侵入性和透明性,但是这在使用关系时证明更具挑战性lazy-loaded.
我看到了许多具有不同透明度的设计方案.
fetchType=FetchType.EAGER)
Hibernate.initialize(proxyObj);
initialize,但是其他实现并不能保证提供任何等价物.Model对象本身(使用动态代理或@Transactional)
loadData()和loadDataWithDeps()
loadDataWithA(),....,loadDataWithX()byId()操作
findZzzById(zid)然后getYyyIds(zid)而不是z.getY()loadData(id, fetchProfile);
我错过了任何选择吗?
在尝试最小化lazy-loaded应用程序设计中关系的影响时,哪种方法是您首选的方法?
(哦,对不起WoT)
axt*_*avt 26
众所周知,hibernate试图尽可能地具有非侵入性和透明性
我会说最初的假设是错误的.转换持久性是一个神话,因为应用程序总是应该关注实体生命周期和被加载的对象图的大小.
请注意,Hibernate无法读取想法,因此如果您知道某个特定操作需要一组特定的依赖关系,那么您需要以某种方式表达您对Hibernate的意图.
从这个角度来看,明确表达这些意图的解决方案(即2,4和7)看起来是合理的,并且不会缺乏透明度.
我不确定你暗示哪个问题(由懒惰引起),但对我来说最大的痛苦是避免在我自己的应用程序缓存中丢失会话上下文.典型:
foo被加载并放入地图中;foo.getBar()(以前从未调用过的东西并且是惰性求值的);因此,为了解决这个问题,我们有许多规则:
OpenSessionInViewFilter对于webapps);try/finally),因此子类不必考虑它;正如您所看到的,这确实无法接近非侵入性和透明性.但是成本仍然可以忍受,与我为急切装载所需支付的价格相比.后者的问题是,有时它会在加载单个引用对象时导致蝴蝶效应,更不用说实体集合了.内存消耗,CPU使用率和延迟提到最少也差得多,所以我想我可以忍受它.
| 归档时间: |
|
| 查看次数: |
21183 次 |
| 最近记录: |