上一节了解了1:m的问题,现在解决最棘手的m:n的问题
一般的社交网站上的post都有分类标签,一个post可以有多个标签,同样一个标签也可以打到多个post上。
比如使用场景如下:
- 一个用户可以创建多个标签
- 一个帖子可以打上多个标签,并且每个标签可能打在多个帖子上
根据这个场景,我们可以看到User和Tag是1:m的关系,Post和Tag是m:n的关系,下面我们就着手建立这两个关系
1、创建Tag对象
1 package com.grailsinaction
2
3 class Tag {
4
5 String name
6 User user
7
8 static constraints = {
9 name(blank: false)
10 }
11 }
2、首先建立User和Tag的1:m关系
修改User
static hasMany = [ posts : Post, tags : Tag ]
这句代表一个User可以有多个Tag,也可以有多个Post
修改Tag
static belongsTo = [ User ]
这句代表级联关系,当User删除了依附在User上的Tag也一并删除。
3、建立Tag和Post的m:n关系
修改Post
static hasMany = [ tags : Tag ]
修改Tag
static hasMany = [ posts : Post ]
最后定义一个维护端,如:当post实体被删除时,依附在被删除的post实体上的tag就没有存在的意义了,也需要一并删除
修改Tag
static belongsTo = [ User, Post ]
4、现在User、Profile、Post、Tag之间的关系已经建立好了:
User-Profile:1:1
User-Post:1:m
User-Tag:1:m
Post-Tag:m:n
5、最后测试一下多对多关系的数据操作
打开PostIntegrationTests类,增加测试方法testPostWithTags
1 @Test
2 void testPostWithTags() {
3 def user = new User(userId: 'joe', password: 'secret').save()
4 def tagGroovy = new Tag(name: 'groovy')
5 def tagGrails = new Tag(name: 'grails')
6 user.addToTags(tagGroovy)
7 user.addToTags(tagGrails)
8
9 def tagNames = user.tags*.name
10 assertEquals([ 'grails', 'groovy'] , tagNames.sort())
11
12 def groovyPost = new Post(content: "A groovy post")
13 user.addToPosts(groovyPost)
14 groovyPost.addToTags(tagGroovy)
15 assertEquals 1, groovyPost.tags.size()
16
17 def bothPost = new Post(content: "A groovy and grails post")
18 user.addToPosts(bothPost)
19 bothPost.addToTags(tagGroovy)
20 bothPost.addToTags(tagGrails)
21 assertEquals 2, bothPost.tags.size()
22 }
分享到:
相关推荐
groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。
elasticsearch-grails-plugin, 恢复的ElasticSearch grails插件 Elasticsearch插件插件这个项目是一个基于Elasticsearch的插件,这个项目是基于的人完成的伟大工作的。你为什么想要为原来的Elasticsearch插件提供...
groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...
Getting-Started-with-Grails-Chinese,一本不错的grails入门书籍,希望对有志于grails的朋友们有用。
Grails In Action.pdf ebook
Grails in Action pdf
Grails in Action - Presentation pdf
Grails in Action Grails in Action Grails in Action Grails in Action Groovy in Action Grails in Action Grails in Action Groovy in Action Groovy in Action
wsdl2java源码 请注意,当前的 3.x 版本使用 cxf 3.0.4 并且需要 WSS4J ...grails-app\endpoints** 和 grails-app\services** 目录中自动装配配置的类 端点创建脚本 create-endpoint 和 create-endpoin
ant-1.9.4jarant-antlr-1.9.4.jarant-junit-1.9.4jar ant-launcher-1.9.4.jar bsf-2.4.0.jar commons-cli-1.2jar commons-logging-1.2.jar gpars-1.2.1.jar groovy-2.4.5jar groovy-ant-2.4.5.jar ...
基于java的动态语言Groovy 构建的敏捷web开发框架grails经典入门教程
Grails In Action 2009最新版,英文的。很详细,学习groovy和grails的不二之选。
Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程
实测可用
实测可用
实测可用
实测可用