托管服务器: 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异常。关于如何解决这个问题的想法?
答案 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。删除索引后,这一切都对我有用。