[Grails] grails的domain类必须有主键吗?

Aaron5 2011-11-03
如题:grails的domain类必须有主键吗?

我现在发生个问题,比如我的mysql中有一张test表:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `fid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `desc` varchar(300) DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`fid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


我使用create-domain-class Test 来创建一个domain类:

class Test {
	
	static mapping = {
         table 'test'
         version false
    }
	
	Integer fid
	String desc
	
    static constraints = {
    }
}



用create-controller Test 来创建 controller类:
class TestController {
    //启用了脚手架功能	
    def scaffold = Test
}


结果访问test的列表页面出现异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'this_.id' in 'field list'
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
	at com.mysql.jdbc.Util.getInstance(Util.java:382)
......   
 


kidli 2011-11-03
需要主键,你这个代码启动的时候肯定有错误没注意看吧。
从你这个domain的定义来看,使用了默认的自增主键id,但是你又自己建了一张表,表里已经有一个自增的字段fid了,启动的时候肯定会提示无法创建id字段,后面的异常也就自然出现了。

建议你把表删掉,让grails自己创建。
如果主键字段非得叫fid的话,在mapping里加上“id name:'fid'”
Aaron5 2011-11-04

也就是说grails的domain默认都有一个id字段存在着吗?
有没有办法将id字段去除掉(比如想version false)?
如果是个我已存在的表中没有id或者是联合主键怎么处理。希望帮忙解疑下,谢谢。官网文档似乎没有细说ID和version的问题
kidli 2011-11-07
id是一定要的(当然名称、形式可以多变),不需要的话,不闻不问让他自生自灭不就够了。
grails文档里有说联合主键(见Composite Primary Keys一章),不过这并不推荐这么做,不够详细的话google一下,英文资料不少,反正比较罗嗦。
个人倾向于使用constraints的unique来创建唯一索引。
zeeeitch 2011-11-23
复合主键

http://itrc.jju.edu.cn/u/MFniy2
Global site tag (gtag.js) - Google Analytics