我有名为anto2
的mysql表。其中只有一列name
varchar 100
。我试图在grails域类中映射此表:
class Anto {
String grailsName
static constraints = {
}
static mapping = {
table 'anto2'
grailsName column: 'name'
}
}
在我run-app
之后,我可以看到我的表已添加了两列:
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name | varchar(100) | YES | | NULL | |
| id | bigint(20) | NO | | NULL | |
| version | bigint(20) | NO | | NULL | |
+---------+--------------+------+-----+---------+-------+
我为此Domain类生成了静态视图和控制器,当我尝试保存它时,我的save()
方法(使用generate-all
命令生成)中出现错误。错误如下:
2012-07-09 23:05:26,391 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver - SQLException occurred when processing request: [POST] /mysql/anto/save - parameters:
create: Create
Field 'id' doesn't have a default value. Stacktrace follows:
Message: Field 'id' doesn't have a default value
Line | Method
->> 1073 | createSQLException in com.mysql.jdbc.SQLError
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 3597 | checkErrorPacket in com.mysql.jdbc.MysqlIO
| 3529 | checkErrorPacket . in ''
| 1990 | sendCommand in ''
| 2151 | sqlQueryDirect . . in ''
| 2625 | execSQL in com.mysql.jdbc.ConnectionImpl
| 2119 | executeInternal . in com.mysql.jdbc.PreparedStatement
| 2415 | executeUpdate in ''
| 2333 | executeUpdate . . in ''
| 2318 | executeUpdate in ''
| 105 | executeUpdate . . in org.apache.commons.dbcp.DelegatingPreparedStatement
| 25 | save in mnm.AntoController
| 1110 | runWorker . . . . in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . . . . . in java.lang.Thread
为什么会这样?哪里出错了?
答案 0 :(得分:3)
如果你没有指定你的id生成器类型,GORM将使用你的数据库的本机策略。如果你使用mysql作为db,它将使用IDENTITY策略创建你的id来生成它们。此策略需要在您的ID列上自动增加。
虽然我认为定义策略更好。您可以使用SEQUENCE策略:
id column:'id_anto2', generator:'sequence', params:[sequence:'tab_anto2_seq']
然后在数据库中创建一个具有相同名称的序列(因此您不必使用Hibernate为您自动创建的序列)。这很容易,就像一个魅力。
此外,要放弃版本字段,请在映射块中插入false。所以,它会像:
static mapping = {
table 'anto2'
id column: 'id_anto2', generator: 'sequence', params: [sequence:'tab_anto2_seq']
grailsName column: 'name'
version false
}
答案 1 :(得分:0)
看起来你缺少id映射。尝试向静态映射闭包添加id引用。此外,如果这是现有数据库,您可能希望将版本设置为false,或者grails可能会尝试使用版本列更改表,具体取决于您设置datasource.groovy的方式。
table 'anto2'
version false
id column:'anto2_ID'
grailsName column: 'name'