可能重复:
休眠:具有相同标识符值的不同对象已与会话关联
我在 Grails 的控制器中有以下代码失败并"a different object with the same identifier value was already associated with the session"
显示错误消息。我已经访问了几个页面,上面说我必须"merge"
在调用 save 之前调用,最终出现此错误Provided id of the wrong type for class com.easytha.QuizTag. Expected: class java.lang.Long, got class org.hibernate.action.DelayedPostInsertIdentifier
有人建议 grails 可搜索插件可能是导致此问题的原因,我应该从我的域类中删除 searchable = true ,这不是一个选项(请参阅上一篇文章grails searcheable plugin search in inner hasMany class)
需要指出的一点是,在调用 q.save() 时不会抛出错误,而是在调用 redirect redirect(action:"show",id:id) 时抛出错误!
有什么建议么?
def addTags(String tags,Long id){
if(tags){
String[] strTags = tags.split(",");
Quiz q = Quiz.get(id)
for(String t in strTags){
Tag tagToAdd = Tag.findByTag(t)
if(!tagToAdd){
tagToAdd = new Tag(tag:t)
tagToAdd.save()
}
println "---> "+tagToAdd +" Quiz"+q?.id
def qt = QuizTag.findByQuizAndTag(q,tagToAdd)
if(!qt){
qt = new QuizTag(quiz:q,tag:tagToAdd);
q.addToTags(qt)
}
}
q.save()
redirect(action:"show",id:id)
}
}
- - - - - -编辑 - - - - - - - -
Final code that worked with searchable plugin
def addTags(String tags,Long id){
if(tags){
String[] strTags = tags.split(",");
Quiz q = Quiz.get(id)
for(String t in strTags){
if (q.tags.any { QuizTag qt -> qt.tag.tag == t }) { continue; }
Tag tagToAdd = Tag.findOrSaveByTag(t);
QuizTag qt = new QuizTag(quiz:q,tag:tagToAdd)
q.addToTags(qt)
}
q.save(flush:true)
redirect(action:"show",id:id)
}
}