可能性の重複:
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"
エラーメッセージで失敗しています。 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)
qsave()の呼び出し時にエラーがスローされるのではなく、リダイレクトリダイレクト(action: " show "、id:id)!!
提案がありますか?あなたがQuiz.get(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)
}
}
----------- EDIT ---------------
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)
}
}
:
あなたのような何かを試みることができる「フラッシュ引数が使用されていない限り、オブジェクトがすぐに永続化されることはありません」そのため、要求が完了したときにのみエラーが発生します。 –
@TiagoFariasあなたは正しいです。 q.save(flush:true)を呼び出した後、その行でエラーが発生します。エラーが発生してもデータはまだ保存されています。 "Tag.findByTag(t)"が何かを返すという意味のタグが既に存在する場合にのみ発生します。 – Sap