上一节建立了一个1:1的对象关系,这一节来建立一个1:m的对象关系
一个用户在一个论坛上或消息发布平台上可以发布多个消息,这个场景就是一个经典的1:m关系
1、建立一个Post对象
grails create-domain-class com.grailsinaction.Post
2、给Post对象增加属性
1 package com.grailsinaction
2
3 class Post {
4 static belongsTo = [ user : User ]
5
6 String content
7 Date dateCreated
8
9 static constraints = {
10 content(blank: false)
11 }
12 }
这里的级联关系和1:1是一样的,如果User对象的实体删除了,那么User实体对应的Post也将一并删除。这个动作是单向的,如果某个Post对象的实体删除了,User对象是不会删除的。
我们这里已经告诉Post对象和User对象的关系了,同样也要告诉User对象和Post对象的关系
3、修改User对象属性
1 package com.grailsinaction
2
3 class User {
4 static hasMany = [ posts : Post ]
5 ......
6 }
加入这个关系后,告诉User,可以拥有多个Post,现在就可以用User.addToPosts()给User的实体增加Post实体,或者用User.removeFromPosts()删除Post实体,下面增加测试方法验证这个关系
4、增加一个Post集成测试类
grails create-integration-test com.grailsinaction.PostIntegration
5、增加一个测试方法
1 package com.grailsinaction
2
3 import static org.junit.Assert.*
4 import org.junit.*
5
6 class PostIntegrationTests {
7
8 @Before
9 void setUp() {
10 // Setup logic here
11 }
12
13 @After
14 void tearDown() {
15 // Tear down logic here
16 }
17
18 @Test
19 void testFirstPost() {
20 def user = new User(userId: 'joe', password: 'secret').save()
21 def post1 = new Post(content: "First post... W00t!")
22 user.addToPosts(post1)
23
24 def post2 = new Post(content: "Second post...")
25 user.addToPosts(post2)
26
27 def post3 = new Post(content: "Third post...")
28 user.addToPosts(post3)
29
30 assertEquals 3, User.get(user.id).posts.size()
31 }
32 }
这里要注意,必须要调用User对象的save()方法,User对象才能将User持久化到数据库。一旦User对象保存了,并调用user.addToPosts()方法,Post对象会自动保持
6、运行命令测试结果
grails test-app -integration
当我们的帖子保存到数据库了,怎么能检索出来呢?
应该是先找到需要检索帖子的user对象,再将这个对象的所有post遍历出来,再建立一个集成测试看看结果
7、测试查询post实例
1 @Test
2 void testAccessingPosts() {
3 def user = new User(userId: 'joe', password: 'secret').save()
4 user.addToPosts(new Post(content: "First"))
5 user.addToPosts(new Post(content: "Second"))
6 user.addToPosts(new Post(content: "Third"))
7
8 def foundUser = User.get(user.id)
9 def postNames = foundUser.posts.collect { it.content }
10 assertEquals(['First', 'Second', 'Third'], postNames.sort())
11 }
新建了一个user对象joe,并给这个对象增加了3个post,使用User.get(id)方法获取到user对象,使用user.posts.collect{}闭包遍历user的post。对比时使用了sort()方法对遍历出来的posts排序。
这时会有个问题,一般显示post都会根据创建的时间降序排列,意思是最晚发布的帖子放在最前面,我们可以修改Post对象,让获取到post信息时就将序列排好,拿出来就是我们想要的结果
8、修改Post对象
1 ......
2 static mapping = {
3 sort dateCreated:"desc"
4 }
5 }
这样post返回的结果就是按照创建日期降序排列的了
假如我们是通过用户,再找某用户的帖子时,例如:user.posts.each,这样的场景就需要对用户下的帖子进行排序了,所以需要修改User对象,增加对用户下帖子的排序功能
1 ......
2 static mapping = {
3 profile lazy:false
4 posts sort:'dateCreated'
5 }
6 }
这种方式告诉我们,当我们根据用户去检索用户下的帖子信息时,按照这种方式排序
分享到:
相关推荐
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的流程
实测可用
实测可用
实测可用
实测可用