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

为了用grails实现无限级分类的应用如组织机构、目录、系统菜单等,我碰了几次错,现终于解决了,写出来做个记录.
如果要实现无限级的系统菜单,我们实现的类如下
Java代码 复制代码
  1. class SystemMenu {  
  2.    String name;  
  3.    String description;  
  4.    SystemMenu parent;  
  5.    static belongsTo =[parent:SystemMenu ]  
  6.    static hasMany = [childrens:SystemMenu];    
  7. }  
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进入了死循环,因为上级菜单的数据的上级指向了自己。
后来把类改成
Java代码 复制代码
  1. class SystemMenu {  
  2.    String name;  
  3.    String description;  
  4.    SystemMenu parent;  
  5.    static belongsTo =[parent:SystemMenu ];  
  6.    static hasMany = [childrens:SystemMenu];  
  7.    static constraints = {  
  8.         parent(nullable:true)  
  9.     }    
  10. }  
class SystemMenu {    String name;    String description;    SystemMenu parent;    static belongsTo =[parent:SystemMenu ];    static hasMany = [childrens:SystemMenu];    static constraints = {         parent(nullable:true)     }   } 

让parent_id字段可以为空,结果就解决了问题,数据操作不再出现问题,可以自关联的应用。其实也可以这么实现:
Java代码 复制代码
  1. class SystemMenu {  
  2.    String name;  
  3.    String description;  
  4.    SystemMenu parent;  
  5.    static belongsTo =[parent:SystemMenu ]  
  6.     static hasMany = [childrens:SystemMenu];  
  7.     static mapping = {  
  8.        parent:[column:'parent_Id',lazy:"true",cascade:"none"]  
  9.        children joinTable:[name:'children', key:'parent_Id', column:'Id',lazy:"true",inverse:"false",cascade:"none"]  
  10.     }  
  11.     static constraints = {  
  12.         parent(nullable:true)  
  13.     }    
  14. }  
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 真的好用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值