`
- 浏览:
111692 次
- 性别:
- 来自:
农村进城务工人员
-
以下涉及的几个问题是在实际开发中经常或碰到的,大家也渐渐形成了所谓的“最佳实践”,不过还存在一些问题,没有好的方案,请大家一起探讨。
1、是否延迟加载
为了保持较好的性能,通常我们会选择延迟加载关联对象,这一点在one-to-many、many-to-one中体现最深。然而在下列情形中我们可能需要立刻加载关联的对象:
有一个Topic表,一个Comment表,Topic有一些统计信息例如浏览次数、回复次数、最后回复时间(回复者),这些信息是需要在查询Topic时立刻加载的。通常有两种方案:
1)将这些信息保存在Topic中,即topic表中含有这些统计信息字段。
这种设计的问题:这些统计信息需要经常修改,例如有了新的回复,这会引起对topic表的更新,由于topic表的内容较多(含有text类型的字段),更新时性能影响较大。
2)将这些统计信息单独放在另一张表topic_stat。
由于要立刻加载这些统计信息,所以要使用one-to-one主键关联,即将topic的主键作为topic_stat的主键,但是很不幸,这里又引起了另一个问题:每次对topic的分页查询都会再发送n个sql去查询关联的topic_stat,也就是n+1问题;而查询指定id的topic会使用left out join的方式抓取关联的topic_stat。所以这里的瓶颈是n+1问题。
所以以上两种方案都不是理想的方案,有人提出使用唯一外键关联的方式避免n+1问题,但是这种方式会lazy加载关联对象,在需要立刻加载关联对象的情景下(如topic需要立刻加载topic_stat),这种方法是不适用的(对于不需要立刻加载而体现为一对一关系的情况下,唯一外键关联是一种很好的方案)。
2、OpenSessionInView
针对需要立刻加载,而又想避免由于使用one-to-one主键关联引起n+1查询的问题,有人提出使用OpenSessionInView方法,这种方法也是可以接受的方案,但是由于session的打开是在请求到来就开始,视图渲染完毕之后才关闭,这中间的时间间隔较大,对于数据库访问频繁的应用来讲,不是一种好的方案。
结合上面的讨论,我想大家都有各自的看法,请大家分享一下。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...
Hibernate关联关系是Java持久化框架Hibernate中的核心概念,它允许我们在数据库中建立对象之间的关系映射,以便在程序中操作对象时,可以自动处理与数据库的交互。本篇将深入探讨Hibernate的四种主要关联关系:一对...
在这个“hibernate关联关系实例”中,我们将深入探讨四种基本的关联关系:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many),同时也会涉及Hibernate查询语言(HQL)...
这篇博客"Hibernate关联关系疑问"可能探讨了在使用Hibernate处理对象关系映射(ORM)时遇到的一些关联问题。在ORM中,关联关系是数据库表之间的连接,如一对一、一对多、多对一和多对多关系。 1. **一对一关联...
本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...
本篇文章将深入探讨Hibernate中的三种主要关联关系:一对一、一对多和多对多。 **一对一关联(One-to-One)** 一对一关联在现实生活中很常见,例如一个人只有一个身份证。在Hibernate中,这种关联可以通过`@...
本篇文章将深入探讨Hibernate中的关联映射,特别是One-to-One(一对一)关联,这是一种表示两个实体之间一对一关系的映射方式。我们将通过源码分析和实际例子来理解其工作原理。 ### 一、One-to-One关联概述 在...
本篇文章将详细探讨双向一对一主键关联映射的概念、配置以及实际应用。 首先,我们需要了解一对一关联的类型。一对一关联分为两种:基于主键的关联(Primary Key Association)和基于外键的关联(Foreign Key ...
在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...
本篇文章将深入探讨如何使用注解配置Java Bean并建立Hibernate的关联关系。 首先,我们需要理解Java Bean的概念。Java Bean是一种符合特定规范的Java类,通常包含属性、getter和setter方法以及构造函数。在...
本文将深入探讨Hibernate的关联映射学习,包括一对多、多对一、一对一等多种关系映射的方式。 首先,我们来看一下“一对多”(One-to-Many)的映射关系。在Hibernate中,这种关系通常用在一个实体可以拥有多个子...
本文将深入探讨“Hibernate关联表问题”,基于给出的标题和描述,我们将重点讨论Hibernate中的多对多(Many-to-Many)关联映射。 在关系型数据库中,多对多关联是最复杂的一种关系,比如用户可以有多个角色,角色也...
标签中的“源码”可能意味着博客深入探讨了Hibernate的内部实现,包括懒加载策略在源码中的体现和执行流程。而“工具”则可能涵盖了如何在实际项目中使用Hibernate的懒加载功能。 在压缩包文件“hibernate_lazy_for...
在Java的持久化框架Hibernate中,数据关联技术是其核心特性之一,它使得对象关系映射(ORM)更加灵活和高效。本笔记将深入探讨...在实际开发中,还需要根据业务需求灵活调整关联策略,确保数据的完整性和一致性。
本文将深入探讨Hibernate的缓存策略,包括一级缓存、二级缓存以及查询缓存,并结合源码分析其工作原理。 ### 一级缓存 一级缓存是Hibernate默认开启的缓存,也称为Session缓存。每当我们在Session中进行持久化操作...
这可能是测试Hibernate关联映射的一个示例项目或者类。通常,这样的测试会包含各种关联映射的实例,如实体类的定义,配置文件或注解,以及测试用例,用于验证关联映射是否按预期工作。 **详细知识讲解:** 1. **一...
今天我们要探讨的是Hibernate的抓取策略,特别是针对set集合的策略。在大型应用中,有效地管理数据加载能显著提升性能,减少数据库交互次数,这就是抓取策略的核心作用。 首先,我们需要理解什么是抓取策略。在...
**Hibernate关联映射详解** 在Java的持久化框架中,Hibernate是一个非常强大的工具,它使得开发者可以更加方便地处理数据库操作。其中,关联映射是Hibernate的核心特性之一,它允许我们将对象模型与关系数据库模型...
本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...