为了用grails实现无限级分类的应用如组织机构、目录、系统菜单等,我碰了几次错,现终于解决了,写出来做个记录.
如果要实现无限级的系统菜单,我们实现的类如下
意思是:一个菜单项属于它的上级菜单[parent],同时又有它的子菜单[childrens]。
但用上面的类来实现的话,数据是无法保存的,首先报的一个错是:
[class SystemMenu]类的属性[parent]不能为null
这是因为新增第一条数据时没有上级菜单,我想能不能在数据库中先初始一条数据
但还是不行,出现约束违例手工插不上数据;没办法试了一下parent_id字段等于本记录的ID
可以插入数据了,再用grails试新增一条数据时,grails进入了死循环,因为上级菜单的数据的上级指向了自己。
后来把类改成
让parent_id字段可以为空,结果就解决了问题,数据操作不再出现问题,可以自关联的应用。其实也可以这么实现:
grails 真的好用
如果要实现无限级的系统菜单,我们实现的类如下
- class SystemMenu {
- String name;
- String description;
- SystemMenu parent;
- static belongsTo =[parent:SystemMenu ]
- static hasMany = [childrens:SystemMenu];
- }
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)
- }
- }
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)
- }
- }
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 真的好用