Eventuali duplicati:
Hibernate: different object with the same identifier value was already associated with the sessionGrails "un oggetto diverso con lo stesso valore identificativo è stato già associato alla sessione" Errore
ho il seguente codice nel mio controller in Grails che non funziona con il messaggio di errore "a different object with the same identifier value was already associated with the session"
. Ho già visitato alcune pagine in cui si dice che devo chiamare "merge"
prima di chiamare risparmio che finisce con questo errore Provided id of the wrong type for class com.easytha.QuizTag. Expected: class java.lang.Long, got class org.hibernate.action.DelayedPostInsertIdentifier
Qualcuno ha suggerito che graal plug-in per la ricerca potrebbe essere la causa questo e dovrebbe rimuovere ricercabile = vera forma il mio dominio classe che non è un'opzione (fare riferimento al post precedente qui grails searcheable plugin search in inner hasMany class)
Una cosa da sottolineare è che l'errore non viene generato al momento della chiamata di q.save() piuttosto che viene generato durante il richiamo del reindirizzamento redirect (azione: " spettacolo", id: id) !!
Qualche suggerimento?
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)
}
}
Dalla descrizione del metodo save(): "L'oggetto non verrà persistito immediatamente se non si utilizza l'argomento a filo" Ecco perché l'errore si verifica solo al termine della richiesta. –
@TiagoFarias hai ragione. dopo aver chiamato q.save (flush: true) ottengo l'errore giusto su quella linea, l'altra cosa da notare qui è che anche dopo l'errore i miei dati vengono ancora salvati! Anche questo errore si verifica solo se il tag esiste già che significa "Tag.findByTag (t)" restituisce qualcosa – Sap