多对多的关系是对称的关系,两个连接的表都互相使用has_and_belongs_to_many来声
明它们之间的关系。
在数据库中,多对多关联是使用中间连接表来实现的。它包含一对外键连接两个目标表。
Active Record假定这个连接表的名字是两个目标表名以字母顺序串联起来。在前面例子中,
我们连接表categories和表products, Active Record会去找一个名为categories_products的连接表。
注意:我们的连接表没有id这个列。这其中有两个原因,第一,它不需要-记录行已经
有两个定义好了的唯一外键。我们在DDL是这样定义表。
create table categories_products (
category_id int not null,
product_id int not null,
constraint fk_cp_category foreign key (category_id) references
categories(id),
constraint fk_cp_product foreign key (product_id) references
products(id),
primary key (category_id, product_id)
);
第二个原因是Active Record在访问记录行自动会包括连接表的所有列。如果连接表包
括一个id的列,它的id就会覆盖掉被连接表记录行的id.这个以后我们还会说。
has_and_belongs_to_many() 声明
has_and_belongs_to_many(用habtm来代替吧,太长了)在很多方面和has_many都很
像。habtm创建了一个属性,本质上就是个集合。这个属性支持很多和has_many一样的方法 。
另外,当关联两个对象时,habtm允许你给连接表加入信息。让我们举个列子。
也许我们使用Rails写一个社区站点,用户可以阅读文章。可能有很多用户,很多文章,
并且任何用户可以阅读任何文章。为了跟踪,我们想知道读每篇文章的是谁,以及每个人读
的是什么文章。还想知道一个用户读一篇文章的最后时间。我们只要一个简单的连接表就行
了。
我们创建两个model类,以便于通过这个表连接它们。
class Article < ActiveRecord::Base
has_and_belongs_to_many :users
# ...
end
class User < ActiveRecord::Base
has_and_belongs_to_many :articles
# ...
end
这允许我们做些事情,如列出阅读过文章123的用户和由pragdave读过的所有文章。
# Who has read article 123?
article = Article.find(123)
readers = article.users
# What has Dave read?
dave = User.find_by_name("pragdave")
articles_that_dave_read = dave.articles
当我们应用程序注意到有人已经在读一篇文章时,它会把用户记录和这个文章连接在一
起。我们将使用User类中的一个实例方法来做这件事。
class User < ActiveRecord::Base
has_and_belongs_to_many :articles
def read_article(article)
articles.push_with_attributes(article, :read_at => Time.now)
end
# ...
end
分享到:
相关推荐
### EF 多对多关系 增删改应用实例解析 在实体框架(Entity Framework,简称EF)中处理多对多关系是常见的需求之一,尤其是在数据模型设计中涉及到多个实体间复杂关联的情况下。本文将详细解析如何在EF中实现多对多...
在这个例子中,User实体与Role实体之间是多对多关系,`user_role`是中间表,包含`user_id`和`role_id`两个外键。 总结,JPA的关系映射提供了强大的工具,使得开发者能够轻松地在对象模型和关系数据库之间进行转换。...
在处理数据仓库和在线分析处理(OLAP)时,多对多关系是复杂数据模型的关键特征之一。在这份白皮书中,Marco Russo和Alberto Ferrari深入探讨了如何在Microsoft SQL Server Analysis Services中实现支持多对多关系的...
在数据库设计中,多对多关系是常见的关联类型,它表示两个实体之间存在多个匹配的可能性。例如,在教育领域,一个教师可以教多个学生,而一个学生也可以被多个教师教导。在Java编程中,这种关系通常通过集合(如Set...
在Hibernate中,多对多关系通常通过中间表来实现,这个中间表包含了两个实体的主键作为外键。你需要在实体类中定义对应的集合属性,并在对应的`@ManyToMany`注解中指定关联的实体和中间表的信息。例如: ```java ...
iBatis多对多关系详解 iBatis是一种流行的持久层框架,用于简化Java应用程序和关系数据库之间的交互。在本文档中,我们将详细介绍iBatis在处理多对多关系时的配置和实现。 多对多关系 多对多关系是一种常见的关系...
在数据库设计中,多对多关系(Many-to-Many)是一种常见的关系模型,它表示两个实体之间存在多个关联。在本案例中,我们看到的文件名暗示了可能涉及教师(Teacher)、学生(Student)和他们之间的关系。我们将通过...
例如,学生和课程就是一个典型的多对多关系,一个学生可以选修多个课程,而一个课程也可以被多个学生选修。在这个场景下,我们通常会创建一个关联表来存储这两类对象之间的关系。 标题中的"hibernate多对多关系...
本项目"0515student的一对多 多对多关系项目包"主要关注的就是这种关系模型,即一对多和多对多关系。我们将深入探讨这两个概念,并结合使用的编程技术——Servlet和JSP来阐述其在实际项目中的应用。 首先,一对多...
数据库多对多关系是数据库设计中的一个重要概念,它在实体之间的关联中扮演着核心角色。在传统的数据库模型中,我们通常遇到一对一、一对多和多对一的关系,但多对多关系则是更为复杂的一种,特别是在处理两个实体...
本项目聚焦于Hibernate中的多对多关系映射,这是一种复杂但常见的数据库关联类型,适用于如用户角色、商品类别等场景。 **一、多对多关系** 在数据库设计中,多对多关系表示两个实体之间存在多个匹配的可能性。...
例如,一个学生可以选修多门课程,一门课程也可以被多名学生选修,这就是典型的多对多关系。 在`ManyToMany`配置中,通常需要创建一个关联表(也称为中间表或连接表),用于存储两个实体之间的关系。关联表通常包含...
接下来,我们将深入探讨Hibernate中的多对多关系,包括它的配置、映射和操作。 1. **多对多关系的配置**: 在Hibernate中,多对多关系通过`@ManyToMany`注解来声明。这个注解需要放在实体类的属性上,通常是List...
多对多关系是指两个实体之间存在复杂的关系,每个实体都可以与多个其他实体关联,反之亦然。在EJB 3.0中,这种关系通过使用JPA(Java Persistence API)和注解来配置。下面我们将深入探讨这个话题。 首先,我们需要...
在Java的持久化框架Hibernate中,"双边多对多关系"是一种常见的数据库关系映射方式。多对多关系表示两个实体之间存在多个关联,而双边则意味着这种关联是双向的,即每个实体都可以关联到另一个实体的多个实例。在本...
在这个项目中,SSH被集成在一起,实现了两个表之间的多对多关系插入功能。下面将详细阐述SSH框架的特点以及多对多关系在数据库设计中的应用。 **Spring框架**是Java应用程序的核心,它提供了依赖注入(DI)和面向切...
在Web开发中,数据模型是构建应用程序的基础,而多对多关系是数据库设计中的一个重要概念。多对多关系(Many-to-Many Relationship)是指在两个实体之间存在多种连接,每个实体都可以与另一个实体的多个实例相关联。...
在实际应用中,比如用户可以加入多个角色,角色也可以被多个用户拥有,这就是典型的多对多关系。下面将详细介绍如何在Hibernate中设置和操作多对多关系。 一、配置多对多关系 1. **映射文件配置**: 在Hibernate的...
对于处理多对多关系的数据,分页显得更为复杂,因为涉及到的对象关联和集合的处理。本篇将详细阐述如何在SSH框架下实现分页,特别是针对多对多关系的集合进行分页。 首先,我们需要创建一个`PageModel`类,用于存储...
### Hibernat 使用Criteria查询多对多关系(SET集合)条件 #### 背景介绍与概念理解 在Java开发中,特别是在企业级应用中,持久化层的处理至关重要。Hibernate作为一款流行的Java持久化框架,它提供了一种非常简便...