`
lidg
  • 浏览: 5104 次
社区版块
存档分类
最新评论

使用Grails实现树形结构无限级分类

阅读更多
为了用grails实现无限级分类的应用如组织机构、目录、系统菜单等,我碰了几次错,现终于解决了,写出来做个记录.
如果要实现无限级的系统菜单,我们实现的类如下
class SystemMenu {
   String name;
   String description;
   SystemMenu parent;
   static belongsTo =[parent:SystemMenu ]
   static hasMany = [childrens:SystemMenu];  
}

意思是:一个菜单项属于它的上级菜单[parent],同时又有它的子菜单[childrens]。
但用上面的类来实现的话,数据是无法保存的,首先报的一个错是:
[class SystemMenu]类的属性[parent]不能为null
这是因为新增第一条数据时没有上级菜单,我想能不能在数据库中先初始一条数据
但还是不行,出现约束违例手工插不上数据;没办法试了一下parent_id字段等于本记录的ID
可以插入数据了,再用grails试新增一条数据时,grails进入了死循环,因为上级菜单的数据的上级指向了自己。
后来把类改成
class SystemMenu {
   String name;
   String description;
   SystemMenu parent;
   static belongsTo =[parent:SystemMenu ];
   static hasMany = [childrens:SystemMenu];
   static constraints = {
        parent(nullable:true)
    }  
}

让parent_id字段可以为空,结果就解决了问题,数据操作不再出现问题,可以自关联的应用。其实也可以这么实现:
class SystemMenu {
   String name;
   String description;
   SystemMenu parent;
   static belongsTo =[parent:SystemMenu ]
    static hasMany = [childrens:SystemMenu];
    static mapping = {
       parent:[column:'parent_Id',lazy:"true",cascade:"none"]
       children joinTable:[name:'children', key:'parent_Id', column:'Id',lazy:"true",inverse:"false",cascade:"none"]
    }
    static constraints = {
        parent(nullable:true)
    }  
}


grails 真的好用
分享到:
评论
8 楼 yangccnu 2012-09-25  
兄弟能搞个完整的代码吗?
7 楼 shiren1118 2009-01-07  
今天忽然才发现grails的一个插件,menu插件。完全可以用~~~~~~~~~用法并不复杂


grails的插件机制真是好
6 楼 lidg 2008-02-27  
我试了一下这样可以实现你的需求:
class SystemMenu {   
   String name;   
   String description;   
   SystemMenu parent;   
    static hasMany = [childrens:SystemMenu];   
    static mapping = {   
       parent:[column:'parent_Id',lazy:"true",cascade:"none"]   
    }   
    static constraints = {   
        parent(nullable:true)   
    }     
}  


CREATE TABLE `system_menu` (
  `id` bigint(20) NOT NULL auto_increment,
  `version` bigint(20) NOT NULL,
  `description` varchar(255) NOT NULL,
  `name` varchar(4) NOT NULL,
  `parent_id` bigint(20) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FKA47C616F1886D91E` (`parent_id`),
  CONSTRAINT `system_menu_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `system_menu` (`id`) ON DELETE SET NULL
)

主要是把表约束 加上“ON DELETE SET NULL”语句,MYSQL下测试过,不用在删除时自己update子目录。
如果要做成删除一个目录,它下级的子目录要归到要删除目录的父目录的话,估计要自己写update子目录了。

5 楼 lidg 2008-02-27  
我想象你这样的需求估计只用配置是不能实现的,你得1.保证数据表没有FOREIGN KEY 要不然数据库是不让删除存在子目录的目录的;2.在你做删除时要自己update它的子目录。这样配置一对多:parent:[column:'parent_Id',lazy:"true",cascade:"none"]不用belongsTo;
去掉数据表中:FOREIGN KEY (`parent_id`) REFERENCES `system_menu` (`id`)的约束;在delete目录前update它的子目录的parent_id为空。
4 楼 Fly_m 2008-02-25  
我想请问一下,关于上面的级联问题.
前几天,我也在做类似的问题,但是现在我需要一个限制条件,就是当删除它的上级时,所用的cascade为save-update,即不删除它的下级关联,仅是做更新.
但是无论我使用上面的第一个例子,还是第二段代码,它的更新都是采用的delete模式,会级联删除它的所有下级.即使将cascade,改为save-update模式,也不会有任何作用.
我想请问一下,如何处理这种情况.现在一直在郁闷中,参考文档上的例子,也没有说得很明白,有人知道这个问题么?
3 楼 shiren1118 2008-02-21  
呵呵,感谢分享

曾见过一个用js实现的,05年的一本书啦,原理一样
2 楼 agile_boy 2008-02-21  
呵呵,确切的说,是GORM实现的
1 楼 BIGN 2008-02-21  
嘿,兄弟,可以共享下代码吗

相关推荐

    使用 Grails 快速开发 Web 应用程序

    2. **View**:Grails使用GSP(Groovy Server Pages)作为视图,类似于JSP,但更灵活,允许在页面中直接嵌入Groovy代码,实现动态内容的生成。 3. **Controller**:控制器负责处理用户请求,管理业务逻辑,接收表单...

    grails实现分页技术

    在Grails这个基于Groovy的敏捷开发框架中,实现分页功能对于任何Web应用程序都是至关重要的,特别是当处理大量数据时。Grails提供了一些内置的支持,但如果你需要在自定义的控制器和视图中实现分页,那么就需要遵循...

    使用Grails快速开发Web应用

    - **创建应用**:使用`grails create-app Contact`命令可快速生成名为“Contact”的应用框架,该命令自动生成了标准的项目目录结构,包括但不限于`grails-app`下的`conf`、`controller`、`domain`、`i18n`、`...

    Eclipse下搭建Grails项目

    在Eclipse中,Grails项目的结构和管理将得到很好的支持,包括源代码编辑、构建、测试和调试。 注意,尽管Eclipse对Grails的支持相比IntelliJ IDEA和NetBeans可能稍显不足,但通过Groovy Eclipse插件的配置,开发者...

    Java程序员使用Grails的十大优势

    使用Grails进行开发时,开发者可以通过定义清晰的领域类来实现业务逻辑,从而简化应用程序的复杂度。这种方式使得开发者能够更加专注于业务逻辑本身,而不是被底层的技术细节所困扰。通过领域类,可以直观地看到模型...

    grails使用freemarker.rar

    标题中的“grails使用freemarker.rar”表明这是一个关于如何在Grails框架中应用FreeMarker模板引擎的资源包。FreeMarker是一个开源的、基于Java的模板引擎,它用于生成动态HTML或其他格式的文本,比如XML、PDF等。...

    Grails 下拉框联动最优实现

    "Grails下拉框联动最优实现"这个主题聚焦于如何在Grails应用中优雅地实现下拉框(Dropdown)的联动效果,这种效果常见于表单中,例如一个下拉框的选择会动态更新另一个下拉框的选项。 下拉框联动的核心是前端的交互...

    在Eclipse里使用Grails类创建工具.pdf

    在深入探讨如何在Eclipse环境中使用Grails类创建工具之前,我们先简要回顾一下Grails框架及其核心特性。Grails是一款基于Groovy语言的高性能Web应用开发框架,它遵循约定优于配置的原则,极大地简化了Web应用的开发...

    grails 文档

    通过配置URL映射,Grails允许开发者定义清晰、可读性强的URL结构,与控制器动作关联,实现RESTful API设计。 7. **构建与部署** Grails 使用Gradle作为构建工具,提供自动化构建、依赖管理等功能。构建的WAR文件...

    Grails Grails Grails

    2. **视图(View)**: 视图负责展示数据,通常使用GSP(Grails Server Pages)技术,这是一种结合了HTML和Groovy的模板语言,可以嵌入Groovy表达式和控制结构,实现动态内容的生成。 3. **控制器(Controller)**: ...

    grails-用户手册

    Grails使用Gradle作为构建工具,提供了`grails war` 命令生成可部署的WAR文件,方便在各种Java应用服务器上部署。 九、测试 Grails内置了测试框架,支持单元测试、集成测试和功能测试。通过`test-app` 命令,可以...

    111D:\keke\grails指南\笔记\1111111.txt,grails 初学者,使用说明的。

    从给定的文件信息来看,主要关注点在于Grails框架的初学者使用说明。Grails是一个基于Groovy语言的开源Web应用开发框架,它利用了Java平台的优势,并结合了动态语言的灵活性,使得Web开发变得更为高效、简洁。下面将...

    使用GORM构建Spring Boot应用程序 Grails指南_ Grails框架.pdf

    在本教程中,我们将探讨如何使用GORM(Grails Object-Relational Mapping)构建Spring Boot应用程序。GORM是Grails框架的核心部分,它为开发者提供了简单、强大的数据持久化功能,支持Hibernate和MongoDB等数据库。...

    使用Grails快速开发Web应用.rar

    易于使用的基于Hibernate的对象-关系映射(ORM)层称为Groovy Server Pages (GSP)的表现层技术基于Spring MVC的控制器层构建于Gant 上的命令行脚本运行环境内置Jetty服务器,不用重新启动服务器就可以进行重新加载利用...

    grails快速开发web

    - **实战技巧**:包括 GORM (Groovy Object Relational Mapping) 的使用、如何在 Grails 中实现 Ajax 功能、处理遗留数据库的方法、利用遗留框架以及如何在 Grails 中使用 WebFlow。 - **高效编程系列**:涵盖使用 ...

    eclipse开发grails插件

    **正文** 在IT行业中,开发Web应用程序时,我们经常使用各种框架来提高效率和灵活性。Grails就是一个基于Groovy语言的开源Web应用...无论是新手还是经验丰富的开发者,都能从中受益匪浅,实现高效的Grails应用开发。

    grails中文参考手册

    - **创建一个Grails应用**:使用`grails create-app`命令可以快速创建一个新的Grails应用,这将生成基本的项目结构。 - **Hello World示例**:在新创建的应用中,你可以通过创建一个简单的控制器和视图来实现经典...

    Grails权威指南 Grails权威指南

    《Grails权威指南》是一本全面深入探讨Grails框架的专著,旨在帮助读者掌握这一强大的Web开发工具。Grails是一种基于Groovy语言的开源框架,它为构建现代、高效的应用程序提供了简洁高效的解决方案。本指南针对不同...

    grails login

    这将在指定目录下生成一个完整的Grails项目结构。 **3. 数据库配置** Grails默认使用H2内存数据库,如需使用MySQL,需修改`Config.groovy`中的数据库配置。添加如下代码: ```groovy dataSource { pooled = true ...

Global site tag (gtag.js) - Google Analytics