gpt4 book ai didi

hibernate - Grails "a different object with the same identifier value was already associated with the session"错误

转载 作者:行者123 更新时间:2023-12-02 22:38:34 25 4
gpt4 key购买 nike

Possible Duplicate:
Hibernate: different object with the same identifier value was already associated with the session

我的 Grails Controller 中有以下代码,失败并显示 "a different object with the same identifier value was already associated with the session"错误信息。我已经访问了几个页面,上面写着我必须调用 "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 插件可能会导致此问题,我应该从我的域类中删除 searchable = true ,这不是一个选项(请参阅此处的上一篇文章 grails searcheable plugin search in inner hasMany class )

需要指出的一点是,在调用 q.save() 时不会抛出错误,而是在调用重定向时抛出错误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)
}
}

最佳答案

既然您执行了Quiz.get(id),您就有了一个“已连接”实例,因此您绝对不需要“合并” - 这只是重新连接断开连接的实例。

我认为您收到错误的原因是该行:

def qt = QuizTag.findByQuizAndTag(q, tagToAdd)

QuizTag 实例拉入 session 中,但 Tag tagToAdd = Tag.findByTag(t) 已将该实例与 session 关联,并且您正在分配给另一个实例多变的。现在,您有两个与 session 关联的实例,它们都代表数据库中的同一行:qttagToAdd(它们具有相同的 id)。这会产生不明确的情况,并且是不允许的,因此会出现错误。

看来您实际上并不需要实例化qt(只有在它不存在时才采取操作)。因此,我建议执行查询来查明它是否存在(可能是“选择计数”),而不是实际检索对象实例。这样,您将只有该对象的一份副本。

关于hibernate - Grails "a different object with the same identifier value was already associated with the session"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12808800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com