Grails Web应用程序为远程数据库生成MySql Duplicate条目,但不为本地测试DB生成

时间:2014-08-14 01:44:11

标签: mysql hibernate grails gorm

托管服务器:  Tomcat 7,MySql 5.5.24

本地服务器:  Tomcat 7,MySql 5.6

Grails 2.4.2

仅在使用托管数据库时才会出现此问题,而不是本地MySql服务器。

以下代码中出现错误。

@Override
    def save()
    {
        def comment = new Comment(request.JSON)
        def place = Place.get(params.placeId)
        place.addToComments(comment)
        place.save(flush: true) //Explodes here

        respond comment
    }

错误

| Error 2014-08-13 18:19:01,678 [http-bio-8086-exec-5] ERROR spi.SqlExceptionHelper  - Duplicate entry '1' for key 'UK_fojv2ahcp1jompc2cg2gryqce'
| Error 2014-08-13 18:19:01,789 [http-bio-8086-exec-5] ERROR errors.GrailsExceptionResolver  - MySQLIntegrityConstraintViolationException occurred when processing request: [POST] /SecondAmendmentSupporters/places/1/comments/
Duplicate entry '1' for key 'UK_fojv2ahcp1jompc2cg2gryqce'. Stacktrace follows:
Message: Duplicate entry '1' for key 'UK_fojv2ahcp1jompc2cg2gryqce'
    Line | Method
->>  411 | handleNewInstance  in com.mysql.jdbc.Util
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    386 | getInstance        in     ''
|   1041 | createSQLException in com.mysql.jdbc.SQLError
|   4237 | checkErrorPacket   in com.mysql.jdbc.MysqlIO
|   4169 | checkErrorPacket . in     ''
|   2617 | sendCommand        in     ''
|   2778 | sqlQueryDirect . . in     ''
|   2834 | execSQL            in com.mysql.jdbc.ConnectionImpl
|   2156 | executeInternal .  in com.mysql.jdbc.PreparedStatement
|   2441 | executeUpdate      in     ''
|   2366 | executeUpdate . .  in     ''
|   2350 | executeUpdate      in     ''
|     39 | save . . . . . . . in secondamendmentsupporters.CommentController
|    198 | doFilter           in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter
|    895 | runTask            in java.util.concurrent.ThreadPoolExecutor$Worker
|    918 | run . . . . . . .  in     ''
^    695 | run                in java.lang.Thread

Place和Comment之间的关联是多对一的。许多评论到一个地方。

如果您查看下面的请求,看起来数据库正在尝试为ID为1的Place添加新条目,而不仅仅是更新它。

  

[POST] / SecondAmendmentSupporters / places / 1 / comments /

远程数据库和本地数据库之间的唯一区别是MySql版本。这可能是问题吗?

修改

放置域名

static hasMany =
    [
        comments:Comment
    ]

评论域

static belongsTo = [place: Place]

修改

原来,grails将我的外键place_id视为本地索引(MUL),但在我的远程数据库上,它是唯一的(UNI)因此导致重复的id异常。关于如何解决这个问题的想法?

3 个答案:

答案 0 :(得分:0)

Yo正在保存place对象而不是comment对象。把

comment.save(flush:true)

而不是

place.save(flush: true)

再试一次

答案 1 :(得分:0)

经过许多个小时,我能够确定我的本地数据库和远程数据库之间的区别。事实证明,GORM设置了我的外键' place_id'作为UNI而不是MUL。我将我的表放在远程数据库中,并将以下映射添加到我的注释域并解决了问题。

static mapping = {place index: 'place_id'}

答案 2 :(得分:0)

我找到了答案。

或者至少我找到了答案,认为你有同样的答案。 打开数据库(通过mysql工作台和表检查器或类似工具),发生的事情是某些事情已经创建了一个针对列的索引。我说了些什么,因为grails代码或域中没有创建此索引的内容,但无论出于何种原因,索引都不允许多个entires。删除索引后,这一切都对我有用。