可能重复:
Hibernate: different object with the same identifier value was already associated with the sessionGrails的错误“不同的对象使用相同的标识符值已经与该会话相关联的”
我在我的控制器将以下代码Grails中那与"a different object with the same identifier value was already associated with the session"
错误消息失败。 我已经访问过的几页,它说我必须调用save,与此错误结束Provided id of the wrong type for class com.easytha.QuizTag. Expected: class java.lang.Long, got class org.hibernate.action.DelayedPostInsertIdentifier
有人建议,Grails的搜索插件可能会导致这和我应该删除搜索=真表我的域名之前调用"merge"
类,这是不是一个选项(参见以前的帖子这里grails searcheable plugin search in inner hasMany class)
有一两件事要的一点是,错误没有在调用q.save(),而它同时呼吁重定向重定向(Action的抛出的时间抛出”秀”,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)
}
}
从save()方法的描述:“该对象将除非使用冲洗说法无法立即坚持。”这就是为什么错误只发生在请求结束时。 –
@TiagoFarias你是对的。在调用q.save(flush:true)之后,我在该行得到错误,这里需要注意的是,即使在错误之后,我的数据仍然被保存!此错误只发生,如果标记已经存在意味着“Tag.findByTag(t)”返回 – Sap