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

Hibernate,要懒还是不懒?

左康安
2023-03-14
问题内容

我有entity A,与有着多对多的关系entity B

因此表布局为: A, AB(mapping table), B

为了得到实体A的对象:我叫A.getById()其不getHibernateTemplate().get(A.class, id) 使用spring和hibernate。

问题是,有时后续代码仅需要A,有时后续代码将继续访问关联的B,因此我们希望在某些情况下使用 延迟加载, 在某些情况下则 渴望
使用。但是问题是所有数据库访问都是通过同一单一数据库提供的ADao.java,因此只有一种方法getById()

我应该创建方法getById()的两个版本吗?

但是对于更复杂的情况,如果A也通过多对多连接到C,则可能存在懒加载C和急切加载C的getById()变体,因此所需的变体迅速成倍增长。

您对此选择有何看法?

谢谢


问题答案:

出于一般考虑,请参阅有关获取策略的Hibernate
3.6文档。默认的获取策略是在映射注释或hbm.xml文件中定义的。有三种方法可以从默认的延迟加载策略动态切换到优先加载策略。对于懒加载和急加载用例,前两个需要DAO方法的单独实现:

  1. Criteria.setFetchMode() 在hibernate条件查询中
  2. FETCH HQL查询中的关键字
  3. 从Hibernate 3.5(现在还不太确定,也许是3.6)开始,就有了第三个选择,即使用获取配置文件来动态地从延迟加载切换到渴望加载。

提取配置文件在会话范围内启用/禁用。因此,只要在当前会话中设置了所需的提取配置文件,就可以将相同的DAO方法用于延迟加载和快速加载用例。

在此需要注意的重要一点是,您 只能从 注释或hbm.xml文件中定义 的延迟加载策略切换 到渴望加载策略
,反之亦然。此限制与用于切换获取策略的方法无关。



 类似资料:
  • 我有对象主位置和主国家/地区 MasterLocation.java 主位置存储库.java 为什么对象MasterCountries仍然加载在findByLocationNameLikeIgnoreCase上?如何在此存储库中禁用获取主国家/地区? 谢谢

  • swiper中的图片如何懒加载,还是根本不做懒加载? 求大佬指教!!!

  • 我有一个实体: 然后我有一个控制器,其目的是检索书籍,我的问题是,我的控制器的json响应中包含了流派字段。有没有办法排除jackson序列化对象时延迟加载的字段? 这是我的ObjectMapper的配置: 谢谢 我不能将其标记为JsonIgnore,因为它将永远脱离序列化框。有时我需要检索书籍的体裁,到那时,我将在查询中使用“fetch join”,这样它就不会为空。

  • 随着新的工具栏小部件的引入和AppCompat(android.support.v7.widget.Toolbar)版本的推出,是否还需要调用setSupportActionbar(工具栏)?或者调用setSupportActionbar有什么好处吗;现在我们可以设置标题、子标题、导航图标、导航图标单击侦听器(getSupportActionBar()。直接在工具栏上设置DisplayHomeAs

  • 问题内容: 我正在研究Java,.NET和Groovy中企业应用程序的开发。对于每个平台,我们将尝试实现一个简单的SOAP Web服务有多困难。我们将使用最常用的工具和库来尽可能准确地研究现实世界。 在这方面,当使用Hibernate进行持久化时,是否会更好地反映出使用新的JPA(Java Persistence API)或JPA出现之前就已经存在的Hibernate自定义API的真实情况? 问题

  • 问题内容: 在我的项目中,我需要在运行时在数据库之间切换。我尝试使用Hibernate,但是卡在一个地方,我需要在数据库中映射对象和表。问题是,我有几个带前缀的表:documents2001,documents2002 …据我了解,我在运行时无法将类与表进行映射。我尝试使用iBatis,但问题出在运行时更改数据库。在iBatis中,这很难做到。 也许一些建议,我应该使用什么? 我的要求: 能够在运