zoukankan      html  css  js  c++  java
  • 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来查询城市信息



  • 相关阅读:
    JavaScript二进制数据序列化和反序列化
    三维变换矩阵推导笔记
    如何制作一款“有毒”的游戏
    如何使用visual studio将你的程序打包成安装包
    游戏设计模式系列(三)—— 策划变心太快?也许可以使用组合
    使用LayaAir解析xml文件
    游戏设计模式系列(二)—— 适时使用观察者模式,解耦你的代码
    游戏设计模式系列(一)—— 单线逻辑&&数据驱动,搞定最容易卡死的结算界面
    vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)
    UVALive 6529
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4051423.html
Copyright © 2011-2022 走看看