2012-07-09 2 views
1

나는 anto2이라는 이름의 mysql 테이블을 가지고있다. 하나의 열 namevarchar 100입니다.Grails 도메인 클래스에 mysql 테이블을 매핑하는 방법은 무엇입니까?

+---------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+---------+--------------+------+-----+---------+-------+ 
| name | varchar(100) | YES |  | NULL |  | 
| id  | bigint(20) | NO |  | NULL |  | 
| version | bigint(20) | NO |  | NULL |  | 
+---------+--------------+------+-----+---------+-------+ 
나는이 정적 뷰와 컨트롤러를 생성

: 내 테이블이 두 개 더 열이 추가되었습니다 볼 수 있습니다 내가 run-app를 않았다

class Anto { 

    String grailsName 

    static constraints = { 
    } 

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

후 : 내가 Grails의 도메인 클래스에서이 테이블을 매핑하는 시도 도메인 클래스와 그것을 저장할려고했을 때, 내 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

당신이 아이디 생성기의 당신의 종류를 지정하지 않으면, GORM이 database.If 당신이 그들을을 생성하는 IDENTITY 전략을 사용하여 ID를 생성합니다 데시벨로 MySQL을 사용하고의 기본 전략을 사용합니다. 이 전략은 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 
} 
0

ID 매핑이 누락 된 것 같습니다. 정적 매핑 클로저에 id 참조를 추가해보십시오. 또한이 데이터베이스가 기존 데이터베이스 인 경우 버전을 false로 설정하거나 grails가 datasource.groovy 설정 방법에 따라 버전 열을 사용하여 테이블을 변경하려고 할 수 있습니다.

table 'anto2' 
    version false 
    id column:'anto2_ID' 
    grailsName column: 'name' 
관련 문제