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

本文详细介绍了在Grails开发中如何灵活运用Domain类的主键ID,包括数据类型、生成策略以及如何适应已有数据库表。通过实例演示了如何在代码规范冲突时自定义字段名,并正确处理主键和外键关系。同时强调了所有列默认不能为空的规则,以及如何在constraints中添加约束以允许空值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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类如下:

package com.eternal.business.itemgroup

import java.util.Date;
import com.eternal.business.job.CmJob
import com.eternal.business.item.CmItem
class CmItemGroup {

	Integer quantity
	Integer priority
	Integer category
	Integer printingseq
	String groupType
	Date inserttime
	Date updatetime
	CmJob cmJob
	CmItemGroupState cmItemGroupState
	static constraints = {
		quantity(nullable: true,max: 2147483647)
		priority(nullable: true, max: 2147483647)
		category(nullable: true, max: 2147483647)
		printingseq(nullable: true, max: 2147483647)
		groupType(nullable: true)
		inserttime(nullable: true)
		updatetime(nullable: true)
	}
	
	static belongsTo = CmJob
	static hasMany = [cmitems:CmItem]
	
	static mapping = {
		table 'itemgroup'
		// version is set to false, because this isn't available by default for legacy databases
		version false
		id generator:'hilo',params: [table: 'hilovalue', column: 'nextvalue'],column:'iditemgroup'
		cmJob column:'jobid'
		cmItemGroupState column:'iditemgroupstate'
	}
	
	String toString() {
		return "${id}"
	}
}

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

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

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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值