grails一对多双向关联

前面分享了一些学习grails的心得,可是grails的知识还远不止这些,这次整理了一点有关grails一对多双向关联关系的知识。我认为这样的关联用的地方太多了,这次准备的样例是城市和区域的相关样例。

1.领域模型

class CityInfo {

    static hasMany = [area:AreaInfo]
    static fetchMode = [area:'lazy']
    Integer id;
    String name;
    String code;
    static mapping = {
        table 'm_city'
    }
}

hasMany代表CityInfo是一的一方,fetchMode配置的是抓取模式,这里使用的是懒载入(默认)。要注意的是由于我的数据库中对于的表为m_city;假设不配置表示对于的表为CityInfo


class AreaInfo {
    static belongsTo=[city:CityInfo]
    Integer id;
    String name;
    String areaCode;
    static mapping = {
        table 'm_area'
        areaCode column:'areaCode'
        city column: 'cityId'
    }
}

belongsTo配置的是多的一方,也就是是说AreaInfo中存在一个外键名称是city.综合上面的能够看出CityInfo是主表,而AreaInfo是从表。这里有点奇怪的是areaCode映射出来的列名为area_code为了方便我顺便把要映射的列名改掉了


2.创建控制器和视图

这个步骤就不说了,直接使用intellij IDE就能够自己主动为我们生成控制器和视图了。先来看看生成的控制器能不能用

这说明生成的控制器没有问题,以下加入一个方法用来保存城市和区域信息


//保存城市和区域信息
    @Transactional
    def saveCityAndArea(){
        def a=new AreaInfo()
        a.setName("西山区")
        a.setAreaCode("XS")


        //Set<AreaInfo> s=new HashSet<AreaInfo>()
       // s.add(a)

        def c=new CityInfo()
        c.setName("昆明市")
        c.setCode("KM")


        c.save()
        a.setCity(c)
        a.save()
        render "数据保存成功"
    }

这里要注意的是假设是关系型数据库,那么就不要忘记配置事务。遗憾的是级联保存用这个框架貌似有问题,另外要注意的是grail默认的级联保存和更新,可是不会级联删除除非配置的是双向关联(也配置了belongsTo).

接下来我也写了个方法,用来查询对于城市的区域信息:

  //查询城市信息
    def queryCity(){

        def city=CityInfo.findById(params.id)
        Set<AreaInfo> area=city.getArea()
        Iterator<AreaInfo> it=area.iterator()
        def buf=new StringBuffer()
        while(it.hasNext()){
            AreaInfo info=it.next()
            buf.append(info.getName()+",")

        }
        render buf.toString()
    }

要注意的是findBy是一个动态的查询方法,findById就表示通过Id来查询城市信息



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Grails中实现两表关联有多种方式,以下是其中一种常用的方法: 假设我们有两个领域模型类:`Author`和`Book`,其中`Book`类需要关联`Author`类。 1. 在`Author`类中定义主键: ``` class Author { static hasMany = [books: Book] static mapping = { id column: 'author_id' } Integer authorId String name } ``` 2. 在`Book`类中定义外键: ``` class Book { static belongsTo = [author: Author] static mapping = { author column: 'author_id' } Integer bookId String title Author author } ``` 在这里,我们使用`belongsTo`来指定`Book`类属于`Author`类,并使用`mapping`来指定外键列名。同时,我们还在`Book`类中定义了一个`author`属性,用于访问与此书相关联的作者。 3. 在数据库中创建表格: 在数据库中创建两张表格,分别为`author`和`book`表。在`book`表中需要有一个名为`author_id`的外键列,用于与`author`表建立关联。 4. 保存数据: ``` def author = new Author(name: 'John Doe') author.save() def book = new Book(title: 'My Book', author: author) book.save() ``` 在此示例中,我们先创建一个作者对象,然后创建一个书籍对象,并将作者对象赋给书籍对象的`author`属性。最后,我们分别保存作者和书籍对象到数据库中。 5. 查询数据: ``` def author = Author.get(1) def books = author.books ``` 在这里,我们使用`get()`方法获取id为1的作者对象,并使用`books`属性获取与此作者相关联的书籍列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值