当前位置: 首页 > 面试题库 >

Hibernate延迟加载应用程序设计

吕飞翼
2023-03-14
问题内容

我倾向于将Hibernate与Spring框架结合使用,它具有声明式事务划分功能(例如@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)


问题答案:

众所周知,hibernate试图尽可能做到无创且透明

我会说最初的假设是错误的。透明持久性是一个神话,因为应用程序始终应注意实体生命周期和要加载的对象图的大小。

请注意,Hibernate无法读取想法,因此,如果您知道特定操作需要特定的一组依赖关系,则需要以某种方式表达您打算使用Hibernate的意图。

从这个角度来看,明确表达这些意图(即2、4和7)的解决方案看起来是合理的,并且不会遭受缺乏透明度的困扰。



 类似资料:
  • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 问题内容: 我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。 我只想在集合上使用延迟加载。急切地获取一些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。 这是一些示例代码: 所以这里的问题是,当我检查调试器时,答复的persistantBag-list

  • 问题内容: 我正在使用Hibernate的延迟加载,并且即使在web.xml中定义了一个使用OpenSessionInViewFilter的过滤器后,也正在获取sessionFactory缺少的异常 我的servlet-context.xml具有以下会话和事务管理器定义: 我仍然收到以下异常: 我尝试定义一个sessionFactoryBeanName属性,但结果没有改变。我究竟做错了什么? 问题

  • 问题内容: 这就是我想要做的。 创建具有与孩子的OneToOne关系的父母 父母必须使用延迟加载来获取孩子 如果父母被删除,孩子也被删除 如果孩子被移走,父母不应该受到影响 级联更新和删除必须转换为DDL 班级家长 班级儿童 我的第1、3、4 点 完全正常工作,而 第5点则 部分正常工作,仍然需要解决如何翻译更新部分indo DDL。 第2点 是这里的大问题,对于我目前的解决方案,父级不会延迟加载

  • 我有一个模型如下的项目(伪代码): 现在,如果我尝试获取类似的内容(get(0)只是一个示例): 我get LazyInitializationException未能延迟初始化角色的集合:ClientVersion。客户端,没有会话或会话已关闭 若我更改ClientVersion和客户端之间的关系上的FetchType以使其工作正常,但我当然更希望延迟加载它。 我知道如果我有权访问hibernat