我倾向于将Hibernate与Spring框架结合使用,它具有声明性事务划分功能(例如,@Transactional)。
众所周知,hibernate 尽可能做到非侵入性和透明性,但是在使用关系时这被证明更具挑战性。lazy-loaded
我看到了许多具有不同透明度的设计替代方案。
- 使关系不延迟加载(例如,
fetchType=FetchType.EAGER)
- 这违反了延迟加载的整个想法..
- 使用初始化集合
Hibernate.initialize(proxyObj);
- 这意味着与 DAO 的耦合度相对较高
- 虽然我们可以用 定义一个接口
initialize
,但不保证其他实现提供任何等价物。
- 将事务行为添加到持久
Model
对象本身(使用动态代理或@Transactional
)- 我没有尝试过动态代理方法,尽管我似乎从来没有让@Transactional 处理持久对象本身。可能是由于休眠是在代理上的操作。
- 交易实际发生时失去控制
- 提供惰性/非惰性 API,例如,
loadData()
和loadDataWithDeps()
- 强制应用程序知道何时使用哪个例程,再次紧耦合
- 方法溢出,
loadDataWithA()
, ....,loadDataWithX()
- 强制查找依赖项,例如,仅提供
byId()
操作- 需要很多非面向对象的例程,例如,
findZzzById(zid)
然后getYyyIds(zid)
代替z.getY()
- 如果事务之间的处理开销很大,则一个接一个地获取集合中的每个对象会很有用。
- 需要很多非面向对象的例程,例如,
- 成为应用程序的一部分@Transactional 而不仅仅是DAO
- 嵌套事务的可能考虑因素
- 需要适合事务管理的例程(例如,足够小)
- 小程序影响,虽然可能导致大笔交易
- 为 DAO 提供动态获取配置文件,例如,
loadData(id, fetchProfile);
- 应用程序必须知道何时使用哪个配置文件
- AoP 类型的事务,例如,拦截操作并在必要时执行事务
- 需要字节码操作或代理使用
- 执行交易时失去控制
- 黑魔法,一如既往:)
我错过了任何选择吗?
lazy-loaded
在尝试将关系对应用程序设计的影响降至最低时,您首选哪种方法?
(哦,对不起WoT)