分享

grails学习笔记-7、Domain创建过程中注意的问题

 jasonbetter 2018-04-16

在grails的开发中,Domain类的创建是很关键的。我在开发过程中,遇到了一些问题,写出来,供大家参考。

基础的用法,请参考grails官方文档,这里,我不再说。只说要注意的问题。

1、关于主键ID。grails会默认创建主键,名称:ID。类型:整型。生成策略:简单的自增,从1开始增加。

举个例子:

class SysUser{

  String username;

  String password;

}

上边的Domain类中没有ID字段,但你看数据库表,会发现有ID列。是整型的。在程序中,你可以通过sysUserInstance.id获取到这个值。

如果你想改变ID的数据类型,比如改为字符串。那就显示的定义ID。这样:

class SysUser{

  String id;

  String username;

  String password;

}

想改变生成策略,这样:

class SysUser{

  String id;

  String username;

  String password;

  static mapping={
        id generator:'hilo',params: [table: 'hilovalue', column: 'nextvalue']
    }

}

其余的生成策略都有对应的写法,这里用的是hilo(用的比较多,可以用在数据库集群中)。

这里我再写一种主键自动义时的写法:

id generator:'assigned'    。一般有这两中就能应付大部分情况了,剩下的只能你自己查了。

2、一般情况下,grails工程的开发都是写好Domain类,自动生成数据库表。如果遇到数据库表先有了,要以他们为基础进行开发,那么Domain类就要去适应数据库表。举个我项目中的例子说明:

这是我项目中的一张数据库表:


主键:iditemgroup

外键:iditemgroupstate、jobid

对应的Domain类如下:

[java] view plain copy
  1. package com.eternal.business.itemgroup  
  2.   
  3. import java.util.Date;  
  4. import com.eternal.business.job.CmJob  
  5. import com.eternal.business.item.CmItem  
  6. class CmItemGroup {  
  7.   
  8.     Integer quantity  
  9.     Integer priority  
  10.     Integer category  
  11.     Integer printingseq  
  12.     String groupType  
  13.     Date inserttime  
  14.     Date updatetime  
  15.     CmJob cmJob  
  16.     CmItemGroupState cmItemGroupState  
  17.     static constraints = {  
  18.         quantity(nullable: true,max: 2147483647)  
  19.         priority(nullable: true, max: 2147483647)  
  20.         category(nullable: true, max: 2147483647)  
  21.         printingseq(nullable: true, max: 2147483647)  
  22.         groupType(nullable: true)  
  23.         inserttime(nullable: true)  
  24.         updatetime(nullable: true)  
  25.     }  
  26.       
  27.     static belongsTo = CmJob  
  28.     static hasMany = [cmitems:CmItem]  
  29.       
  30.     static mapping = {  
  31.         table 'itemgroup'  
  32.         // version is set to false, because this isn't available by default for legacy databases  
  33.         version false  
  34.         id generator:'hilo',params: [table: 'hilovalue', column: 'nextvalue'],column:'iditemgroup'  
  35.         cmJob column:'jobid'  
  36.         cmItemGroupState column:'iditemgroupstate'  
  37.     }  
  38.       
  39.     String toString() {  
  40.         return "${id}"  
  41.     }  
  42. }  

在Domain类中,各字段的名称我原样采用了数据库中的列名。主键和外键的设置,都在mapping中。

如果你觉得字段的名称采用数据列名与你的代码规范冲突,那么你完全可以按规范自定义,然后再mapping中将字段名与列名进行映射即可。这样:字段名 column:‘列名’。和外键的处理一样。

还有,将static mapping中的version置为false。

3、所有列默认都是不能为空的。如果有的列可能为空,记得在constraints中加约束。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多