가능한 중복 :
Hibernate: different object with the same identifier value was already associated with the sessionGrails의 오류 "동일한 식별자 값이 다른 개체가 이미 세션과 관련이 있었다"
I 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의 검색 플러그인이 원인이 될 수 있으며 내가 검색 = 진정한 형태로 내 도메인을 제거해야한다고 제안했다이 오류와 함께 종료되는 save()를 호출하기 전에 "merge"
를 호출 할 필요가 있다고 말한다 곳 는 이미 몇 페이지를 방문한 (이전 게시물을 참조하십시오. grails searcheable plugin search in inner hasMany class)
가리키는 한 가지 중요한 점은 q.save()를 호출 할 때 오류가 발생하지 않고 리디렉션 리디렉션 (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)
}
}
----------- 편집 ---------------
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