gpt4 book ai didi

mysql - 如何将 mysql 表映射到 Grails 域类?

转载 作者:行者123 更新时间:2023-11-29 05:35:06 25 4
gpt4 key购买 nike

我有一个名为 anto2 的 mysql 表。其中只有 varchar 100 的一列 name。我试图在 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 | |
+---------+--------------+------+-----+---------+-------+

我为这个域类生成了静态 View 和 Controller ,当我试图保存它时,我在 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

为什么会这样?我哪里错了?

最佳答案

如果您没有指定您的 ID 生成器类型,GORM 将使用您数据库的本地策略。如果您使用 MySQL 作为数据库,它将使用 IDENTITY 策略创建您的 ID 以生成它们。此策略需要在您的 id 列上自动递增。

虽然我认为定义一个策略更好。您可以使用 SEQUENCE 策略:

id column:'id_anto2', generator:'sequence', params:[sequence:'tab_anto2_seq']

然后在您的数据库中创建一个具有相同名称的序列(这样您就不必使用 Hibernate 自动为您创建的序列)。这非常简单,而且非常有效。

此外,要丢弃 version 字段,请在映射 block 中插入 version false。所以,它会像:

static mapping = {
table 'anto2'
id column: 'id_anto2', generator: 'sequence', params: [sequence:'tab_anto2_seq']
grailsName column: 'name'
version false
}

关于mysql - 如何将 mysql 表映射到 Grails 域类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com