"a different object with the same identifier value was already associated with the session"
エラーメッセージで失敗している Grails のコントローラーに次のコードがあります。私はすでにいくつかのページにアクセスしましたが、"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を参照してください) 。
注意すべきことの 1 つは、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)
}
}