我有以下代码将新对象添加到数据库中。首先,它从数据库中获取另一个对象并添加到最终对象中。
我的代码几行
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)
}
关于hibernate - Grails-DuplicateKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969795/