2012-07-09 51 views
1

我有mysql表名爲anto2。其中只有一列namevarchar 100。我試圖映射此表中的Grails域類:我沒run-app如何將mysql表映射到Grails域類?

class Anto { 

    String grailsName 

    static constraints = { 
    } 

    static mapping = { 
     table 'anto2' 
     grailsName column: 'name' 
    } 
} 

後,我可以看到我的表已經添加了兩列:

+---------+--------------+------+-----+---------+-------+ 
| 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 

爲什麼會發生這種情況?我哪裏出錯了?

回答

3

如果不指定類型的ID生成的,GORM將使用您database.If你使用MySQL作爲數據庫,它會創建一個使用標識策略生成它們的ID的本地策略。這個策略要求你的id列有一個自動增量。

雖然我認爲定義一個策略更好。您可以使用序列策略:

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 
} 
0

看起來你缺少id映射。嘗試添加一個id引用到你的靜態映射閉包。另外,如果這是一個現有的數據庫,您可能希望將版本設置爲false,或者grails可能會嘗試使用版本列來更改表,具體取決於您設置datasource.groovy的方式。

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