我正在尝试保存映射为-
class Order {
String prefix
Long orderNumber
Date date
Incident incident
//..... few more variables
}
class Incident {
Double amountToCharge
String description
Boolean isCharged = false
Order order
//..... few more variables
}
现在,当我尝试将它们保存在服务类中时,请执行以下操作:
def save(Order orderInstance, params){
orderInstance.withTransaction { status ->
if (orderInstance.save()) {
if(params.isIncident){
def incidentStatus = saveIncident(params, orderInstance)
if(incidentStatus.result == true){
println "-----------------Incident Saved"
}else{
status.setRollbackOnly()
result["result"] = false
result["message"] = "Could not save. Please try again."
return result
}
}
result["result"] = true
return result
} else {
for (fieldErrors in orderInstance.errors) {
for (error in fieldErrors.allErrors) {
result["message"] = messageSource.getMessage(error, locale)
}
}
return result
}
}
}
def saveIncident(params, Order orderInstance){
def result = [:]
def paramsMap = [:]
paramsMap.description = params.incident.description
paramsMap.amountToCharge = params.incident.amountToCharge
paramsMap.isCharged = params.incident.isCharged ? false : true
paramsMap.order = mROrderInstance
def incidentInstance = new Incident(paramsMap)
println "-----Done till here. Next line throws error----"
if (incidentInstance.save(flush:true)){
orderInstance.incident = incidentInstance
result["result"] = true
}else{
result["result"] = false
for (fieldErrors in incidentInstance.errors) {
for (error in fieldErrors.allErrors) {
println messageSource.getMessage(error, locale)
result["message"] = messageSource.getMessage(error, locale)
}
}
}
return result
}
它给了我以下错误-
ERROR: insert or update on table "order" violates foreign key constraint "fk_a0y0jvv0o9nhkafuj7g7iknc6"
Detail: Key (incident_id)=(2) is not present in table "incident".. Stacktrace follows:
Message: ERROR: insert or update on table "order" violates foreign key constraint "fk_a0y0jvv0o9nhkafuj7g7iknc6"
Detail: Key (incident_id)=(2) is not present in table "incident".
Line | Method
->> 2102 | receiveErrorResponse in org.postgresql.core.v3.QueryExecutorImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1835 | processResults in ''
| 257 | execute . . . . . . in ''
| 500 | execute in org.postgresql.jdbc2.AbstractJdbc2Statement
| 388 | executeWithFlags . . in ''
| 334 | executeUpdate in ''
| 124 | $tt__saveIncident . in com.xyz.fleet.db.OrderService$$EPZ0qsAS
| 46 | doCall in com.xyz.fleet.db.OrderService$_$tt__save_closure6$$EPZ0qsAS
| 815 | withTransaction . . in org.grails.datastore.gorm.GormStaticApi
| 715 | withTransaction in ''
| 41 | $tt__save . . . . . in com.xyz.fleet.db.MROrderService$$EPZ0qsAS
| 32 | $tt__save in com.xyz.fleet.db.MROrderController
| 198 | doFilter . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 53 | doFilter . . . . . . in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
| 49 | doFilter in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
| 82 | doFilter . . . . . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 46 | doFilterInternal in org.grails.jaxrs.web.JaxrsFilter
| 1142 | runWorker . . . . . in java.util.concurrent.ThreadPoolExecutor
| 617 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . . . . . . in java.lang.Thread
当我刷新 session 时出现错误。即使我不这样做,只要它自动刷新,就会抛出相同的错误。
注意:如果我不手动刷新 session ,则保存
Incident
,该方法返回以保存Order
。它也节省了。 Incident
对象附加到Order对象,我可以使用println
检查该对象但是最后,当它自动清除 session 时,会引发相同的错误,如上所示。
所以最后有人可以告诉我这里是什么问题吗?
最佳答案
最有可能的问题是Order.incident
不可为空(默认值),并且您尝试保存订单而不先保存Incident
。
def order = ...
def incident = ...
if(incident.save()) {
order.incident = incident
order.save()
}
如果
Incident
的实例只能属于一个Order
,请尝试添加belongsTo
:class Incident {
Double amountToCharge
String description
Boolean isCharged = false
Order order
//..... few more variables
static belongsTo = [order: Order]
}
双向多对一关联简化了保存实例。
def order = ...
def incident = ...
order.incident = incident
order.save()
双向多对一关联使
Order
和Incident
在一起保存。
关于hibernate - Grails错误 “violates foreign key constraint”在尝试一次保存多个对象时无法添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34633952/