IT序号网

hibernate之Grails-DuplicateKeyException

jiqing9006 2025年12月25日 编程语言 29 0

我有以下代码将新对象添加到数据库中。首先,它从数据库中获取另一个对象并添加到最终对象中。

我的代码几行

            ClassC c = ClassC.findByName(cName) 
 
            ClassD d = new ClassD( 
                    name: "WHATEVER", 
                    classC: c 
            ) 
 
            print "AAA\n" 
 
            ClassC.withTransaction { 
                c = c.merge() 
                // c.save(failOnError: true, flush: true) 
            } 
 
            print "BBB\n" 
 
            // ClassD.withTransaction { 
            //     d = d.merge() 
            // } 
            // print "CCC\n" 
 
            ClassD.withTransaction { 
                d.save(failOnError: true, flush: true) 
            } 
 
            print "DDD\n" 

我收到以下错误:
AAA 
BBB 
 
2013-07-31 13:57:14,279 ERROR JobRunShell - Job DEFAULT.1 threw an unhandled Exception:  
 org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session: [xxx.ClassD#15]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [xxx.ClassD#15] 

你可以帮帮我吗?

谢谢
ClassC.withTransaction { 
    ClassC c = ClassC.findByName(cName) 
 
    // find the record with name: "WHATEVER" or create a new one if there is none 
    ClassD d = ClassD.findOrCreateWhere(name: "WHATEVER") 
 
    c = c.merge() 
    c.addToClassesD(d) // static hasMany = [classesD: ClassD] <-- in ClassC domain 
    c.save(failOnError: true, flush: true) 
} 

错误出自线

c.addToClassesD(d)



:

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131) at org.springframework.web.context.request.RequestContextHolder$currentRequestAttributes.call(Unknown Source) at xxx.AuditLogService.getCurrentUser(AuditLogService.groovy:127) at xxx.AuditLogService$getCurrentUser.callStatic(Unknown Source) at xxx.AuditLogService$_closure2.doCall(AuditLogService.groovy:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1243) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 2013-08-02 09:39:11,110 ERROR ErrorLogger - Job (DEFAULT.1 threw an exception. org.quartz.SchedulerException: Job threw an unhandled exception. at org.quartz.core.JobRunShell.run(JobRunShell.java:224) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131) at org.springframework.web.context.request.RequestContextHolder$currentRequestAttributes.call(Unknown Source) at xxx.AuditLogService.getCurrentUser(AuditLogService.groovy:127) at xxx.AuditLogService$getCurrentUser.callStatic(Unknown Source) at xxx.AuditLogService$_closure2.doCall(AuditLogService.groovy:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1243) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)

请您参考如下方法:

您可能只应在一个事务中完成所有操作。

至于您遇到的错误,我假设您已经为名称设置了unique -当已经有名称为“WHATEVER”的记录时,您将收到该错误。

您可能想要执行以下操作:

ClassC.withTransaction { 
    ClassC c = ClassC.findByName(cName) 
 
    // find the record with name: "WHATEVER" or create a new one if there is none 
    ClassD d = ClassD.findOrCreateWhere(name: "WHATEVER") 
 
    c = c.merge() 
    d.classC = c 
    d.save(failOnError: true, flush: true) 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!