【问题标题】:How to map mysql table to Grails domain class?如何将 mysql 表映射到 Grails 域类?
【发布时间】:2012-07-09 03:50:41
【问题描述】:

我有一个名为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    |       |
+---------+--------------+------+-----+---------+-------+

我为这个域类生成了静态视图和控制器,当我尝试保存它时,我的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

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

【问题讨论】:

    标签: mysql grails


    【解决方案1】:

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

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

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

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

    此外,要丢弃 version 字段,请在映射块中插入 version false。所以,它会是这样的:

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

    【讨论】:

      【解决方案2】:

      您似乎缺少 id 映射。尝试向静态映射闭包添加 id 引用。此外,如果这是一个现有数据库,您可能希望将版本设置为 false,或者 grails 可能会尝试使用版本列更改表,具体取决于您如何设置 datasource.groovy。

          table 'anto2'
          version false
          id column:'anto2_ID'
          grailsName column: 'name'
      

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 2012-05-17
        • 2015-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多