首先是一对一的关系,假设有两张表,Face和Nose
Face表
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
| nose_id | bigint(20) | NO | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
Nose表
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
+---------+--------------+------+-----+---------+----------------+
最简单的定义方式就是
class Face {
String name
Nose nose
}
class Nose {
String name
}
为了从Nose反向找face方便,也可以加一个双向的引用,把Nose的定义修改一下
class Nose {
String name
static belongsTo = [face:Face]
}
如果想让face表里面不出现nose_id,而是在nose表中增加一个face_id作为外键,可以这样定义
class Face {
String name
}
class Nose {
String name
static belongsTo = [face:Face]
}
同样,为了双向引用,可以把Face类的定义修改为
class Face {
String name
static hasOne = [nose : Nose]
}
接下来是一对N的关系,假设有两张表,Book和Author,简化为每本书只有一个作者,每个作者可以有很多本书
Author表
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
Book表
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| author_id | bigint(20) | NO | MUL | NULL | |
| name | varchar(255) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
对应的Domain类定义为
class Author {
String name
static hasMany = [book: Book]
}
class Book {
String name;
static belongsTo = [author : Author]
}
最后是N对N的关系,还是用Author和Book表,每本书可以有多个作者,每个作者也有多本著作
这时候需要一张中间表来保存映射关系
author_book
+-----------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| book_id | bigint(20) | NO | PRI | NULL | |
| author_id | bigint(20) | NO | PRI | NULL | |
+-----------+------------+------+-----+---------+-------+
同时Book表中也不再有author_id的外键
Author类不变,把Book的定义改成下面这样就可以了
class Book {
String name;
static hasMany = [author:Author]
static belongsTo = Author
}
分享到:
相关推荐
1. **模型(Model)**: 在Grails中,模型通常由Domain Classes表示,它们是持久化的实体,与数据库表对应。Domain Classes使用Groovy的元编程特性,如属性验证和动态方法,提供数据验证和业务逻辑。 2. **视图...
此外,还可以配置自动数据库移植功能,它会在应用启动时根据域类(domain class)结构自动创建数据库表。 Grails的命令行工具非常强大,它支持创建Gant脚本来自动化重复的构建任务。用户可以创建可复用的Grails脚本...
创建Grails应用使用`grails create-app`命令,例如创建名为"Contact"的应用。Grails会自动生成包含默认目录结构的应用程序。目录结构包括`grails-app/conf`存储配置文件,`grails-app/controllers`存放控制器,`...
- **创建应用**:使用`grails create-app Contact`命令可快速生成名为“Contact”的应用框架,该命令自动生成了标准的项目目录结构,包括但不限于`grails-app`下的`conf`、`controller`、`domain`、`i18n`、`...
在Grails框架中,域模型(Domain Classes)是用于表示业务实体的对象,它们通常映射到数据库中的表。通过GORM(Grails Object Relational Mapping),Grails提供了自动的ORM支持,使得开发者无需编写复杂的SQL语句...
3. **领域驱动设计(Domain-Driven Design, DDD)**:Grails的域类直接映射到数据库表,文档会解释如何定义领域类、关联关系,以及Lifecycle方法,如`beforeInsert`、`beforeUpdate`等。 4. **服务层**:Grails的...
4. **数据库管理**:`contact_dev.sql`文件可能是数据库的初始脚本,用于创建表结构和填充测试数据。Grails支持多种数据库,如MySQL、PostgreSQL等,你可以通过配置`DataSource`来选择合适的数据库。 5. **Teamtest...
- **Domain Classes**:Grails中的领域类定义了数据库表结构,通过GORM自动创建表和字段。 - **Relationships**:支持一对一、一对多、多对多等关系映射,例如belongsTo、hasMany、hasOne等。 - **Criteria API**...
4. **grails-app/domain**:领域模型文件夹,定义了应用的数据模型和持久化逻辑,通常对应数据库中的表。 5. **grails-app/services**:服务层文件夹,存放业务逻辑代码,可被多个控制器复用。 6. **grails-app/...
- Domain Classes:在Grails中,我们使用Domain Classes来定义数据模型。这些类是Groovy类,包含了属性和方法,它们自动与数据库表关联。 - GORM注解:我们可以使用注解如`@Entity`、`@Table`等来自定义数据表的...
- `grails create-app` 创建新应用,`generate-controller` 生成控制器,`generate-domain-class` 生成领域模型。 5. **Grails Plugins** - Grails 插件系统是其核心特性之一,允许开发者重用和扩展功能。 - ...
2. **创建新项目**:通过`grails create-app`命令创建项目,理解`grails-app`目录结构。 3. **编写Domain Class**:学习如何定义领域类,包括关系映射和验证规则。 4. **创建Controller**:了解如何创建控制器,处理...
在Grails中,模型类通常是Domain Class,它们直接映射到数据库表。如果我们的应用有数据存储需求,那么可能有一个或多个模型类定义在`src/groovy`目录下。 7. **配置(Configurations)** Grails应用的配置主要在`...
创建领域类(Domain Class)即可实现数据持久化,例如,创建一个名为Book的领域类,定义其属性如title、author等,Grails会自动为其生成相应的数据库表和增删查改方法。 在提供的【部分内容】中,`println...
- Grails的GORM(Grails Object Relational Mapping)框架会自动创建与Domain类对应的数据库表。运行`grails dbm-gorm-diff`命令生成数据库更改脚本,然后用`grails dbm-update`或`dbm-changelog-sync`命令将这些...
- 域类(Domain Classes)的定义和作用,它们是Grails用于映射数据库表和业务逻辑的类。 - 数据持久化技术,介绍如何使用Grails自带的GORM(Groovy Object Relational Mapping)技术进行数据库操作。 4. Grails的...
- 使用 `grails create-app` 命令创建一个新的 Grails 应用程序。 - 自动生成的基本项目结构包括源代码目录、配置文件和测试文件。 4. **Grails 控制器(Controllers)** - 控制器处理用户请求,调用服务层方法...
由于Eclipse对Grails的支持有限,建议通过命令行的方式来创建Grails项目: 1. **生成项目目录结构**:在工作空间目录下,如`E:\GRAILS_APPS`,执行`grails create-app Contact`命令。这将创建一个新的Grails项目,...