相关疑难解决方法(0)

Hibernate延迟加载应用程序设计

我倾向于将HibernateSpring框架结合使用,并使用声明式事务划分功能(例如@Transactional).

众所周知,hibernate试图尽可能地非侵入性透明性,但是这在使用关系时证明更具挑战性lazy-loaded.


我看到了许多具有不同透明度的设计方案.

  1. 使关系不是懒惰的(例如, fetchType=FetchType.EAGER)
    • 这违反了延迟加载的整个想法..
  2. 使用初始化集合 Hibernate.initialize(proxyObj);
    • 这意味着与DAO的相对高耦合
    • 虽然我们可以定义一个接口initialize,但是其他实现并不能保证提供任何等价物.
  3. 将事务行为添加到持久Model对象本身(使用动态代理@Transactional)
    • 我没有尝试过动态代理方法,尽管我似乎从来没有让@Transactional处理持久对象本身.可能是因为hibernate是在代理上运行的.
    • 交易实际发生时失去控制权
  4. 提供惰性/非惰性API,例如loadData()loadDataWithDeps()
    • 强制应用程序知道何时使用哪个例程,再次紧耦合
    • 方法溢出loadDataWithA(),....,loadDataWithX()
  5. 强制查找依赖关系,例如,仅通过提供byId()操作
    • 需要很多非面向对象的例程,例如,findZzzById(zid)然后getYyyIds(zid)而不是z.getY()
    • 如果事务之间存在大量处理开销,则逐个获取集合中的每个对象可能很有用.
  6. 创建@Transactional 应用程序的一部分,而不仅仅是DAO
    • 嵌套事务的可能考虑因素
    • 需要适用于事务管理的例程(例如,足够小)
    • 虽然可能导致大量交易,但程序性影响较小
  7. 为DAO提供动态提取配置文件,例如,loadData(id, fetchProfile);
    • 应用程序必须知道何时使用哪个配置文件
  8. AoP类型的事务,例如,拦截操作并在必要时执行事务
    • 需要字节码操作或代理使用
    • 执行交易时失去控制权
    • 黑魔法,一如既往:)

我错过了任何选择吗?


在尝试最小化lazy-loaded应用程序设计中关系的影响时,哪种方法是您首选的方法?

(哦,对不起WoT)

java spring hibernate lazy-loading application-design

86
推荐指数
2
解决办法
2万
查看次数